注解
1、建立up和down数组,分别表示大写字母和小写字母。
2、先对关键字的每个字母计算其编码和映射,再对剩余字母从后往前依次映射。将映射后的结果写入到up和down数组。
代码
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 26;
int up[maxn];
int down[maxn];
string key;
string s;
void prework() {
memset(up, 0, sizeof(up));
int pos = 1;
for(int i=0; i<key.length(); i++) {
up[key.at(i)-'A'] = pos++;
}
for(int i=maxn-1; i>=0; i--) {
if(!up[i]) {
up[i] = pos++;
}
}
for(int i=0; i<key.length(); i++) {
key[i] = key.at(i) + 32;
}
memset(down, 0, sizeof(down));
pos = 1;
for(int i=0; i<key.length(); i++) {
down[key.at(i)-'a'] = pos++;
}
for(int i=maxn-1; i>=0; i--) {
if(!down[i]) {
down[i] = pos++;
}
}
}
void mainwork() {
int len = s.length();
for(int i=0; i<len; i++) {
if(s.at(i)>='A' && s.at(i)<='Z') {
char c = 'A'-1+up[s.at(i)-'A'];
cout<<c;
} else if(s.at(i)>='a' && s.at(i)<='z') {
char c = 'a'-1+down[s.at(i)-'a'];
cout<<c;
} else {
cout<<s.at(i);
}
}
cout<<endl;
}
int main() {
getline(cin, key);
prework();
while(getline(cin, s)) {
mainwork();
}
return 0;
}