为什么全RE

P2636 密码破解者

我有个办法,就是将所有的数组定义都加上1的空间。比如,a[1010]可以写成a[1011]。 我也是一提交就一片紫(RE,运行时错误),然后解决了。 ```cpp #include<cstdio> #include<cstring> using namespace std; const int max_len=150000; class str{ public: int d; bool l; }; class Encrypt{ public: str p[max_len+2];//密码 int e;//加密方式 }en[1004]; int n; char in_[max_len+2]; char qwe[]="KXVMCNOPHQRSZYIJADLEGWBUFT"; int main(){ scanf("%d",&n); scanf("%s",in_); int length=strlen(in_); for(int i=0;i<length;++i){ if(in_[i]>='A'&&in_[i]<='Z'){ (en[0].p)[i].d=(int)(in_[i]-'A'); (en[0].p)[i].l=true; } else{ (en[0].p)[i].d=(int)(in_[i]-'a'); (en[0].p)[i].l=false; } } for(int j=1;j<=n;++j){ scanf("%d",&en[j].e); if(en[j].e==1){ scanf("%d",&(en[j].p)[0].d); } if(en[j].e==2){ scanf("%s",in_); int key=strlen(in_); for(int i=0;i<key;++i){ if(in_[i]>='A'&&in_[i]<='Z'){ (en[j].p)[i].d=(int)(in_[i]-'A'); (en[j].p)[i].l=true; } else{ (en[j].p)[i].d=(int)(in_[i]-'a'); (en[j].p)[i].l=false; } } (en[j].p)[max_len+1].d=key; } } for(int a=n;a>0;--a){ if(en[a].e==1){ int j=(en[a].p)[0].d; str sq[(length+length%j)/j+1][j+1]; int longest[j]; for(int i=0;i<j;++i){ longest[i]=0; } for(int i=0;i<length;++i){ ++longest[i%j]; } for(int c=0,d=0;c<j;++c){ for(int b=0;b<longest[c];++b,++d){ sq[b][c]=(en[0].p)[d]; } } for(int i=0;i<length;++i){ (en[0].p)[i]=sq[i/j][i-i/j*j]; } } if(en[a].e==2){ int key=(en[a].p)[max_len+1].d; for(int i=0;i<length;++i){ (en[0].p)[i].d=((en[0].p)[i].d+26-(en[a].p)[i%key].d)%26; } } if(en[a].e==3){ for(int i=0;i<length;++i){ (en[0].p)[i].d=(int)(qwe[(en[0].p)[i].d]-'A'); } } } for(int i=0;i<length;++i){ if((en[0].p)[i].l==true){ printf("%c",(char)((en[0].p)[i].d)+'A'); } else{ printf("%c",(char)((en[0].p)[i].d)+'a'); } } printf("\n"); return 0; } ```
by happy_dengziyue @ 2021-02-08 17:28:48


|