我有个办法,就是将所有的数组定义都加上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