我先存原图,然后反操作存对应明文
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <cmath>
using namespace std;
string M,k,C;
char key[30][30];
map<char,map<char,char> > m;
int cnt;
void start(){
for(int i=0;i<26;i++){
for(int j=0;j<26;j++){
if('A'+i+j<='Z') key[i][j]='A'+i+j;
else key[i][j]=2*'A'+i+j-'Z'-1;
}
}
}
void shift(){
for(int i=0;i<26;i++){
for(int j=0;j<26;j++){
char x='A'+i;
char y=key[i][j];
if(x<=y) m[x][y]='A'+y-x;
else m[x][y]='Z'-(x-y-1);
}
}
}
int main(){
cin>>k>>C;
start();
shift();
for(int i=0;i<C.size();i++){
int flag=0;
if(k[i]>='a'&&k[i]<='z') k[i]-='a'-'A';
if(C[i]>='a'&&C[i]<='z') C[i]-='a'-'A';
else flag=1;
if(flag) cout<<m[k[cnt]][C[i]];
else cout<<char(m[k[cnt]][C[i]]+'a'-'A');
cnt++;
if(cnt==k.size()) cnt=0;
}
return 0;
}