题意:就是给定字符翻译。这算是常规题了。我的第一想法就map
#include"iostream"
#include"cstdio"
#include"cstring"
using namespace std;
#define N 350
char al[N][50],biao[N][1000];
char s[N][N];
int n;
void fun(){ //26个字母处理
int i,j;
char ch[N];
scanf("%c",&ch[1]);
scanf("%s",al[1]);
for(i=2;i<=26;i++){
getchar();
scanf("%c",&ch[i]);
scanf("%s",al[i]);
}
getchar();
}
int main(){
fun();
int i,j;
scanf("%d",&n);
getchar();
for(i=1;i<=n;i++){
gets(s[i]);
int sign = s[i][0]-64; //下标
strcpy(biao[i],al[sign]);
for(j=1; s[i][j]!='\0'; j++){//赋值字母
sign = s[i][j]-64;
strcat(biao[i],al[sign]);
}
}
// getchar();
int m,count,flag2,flag1;
char s1[N][N],ss[N][N];
while(~scanf("%d",&m) && m){
flag2 = 1;//每一个S1n与表比较
int vis[N];
getchar();
count = 1;
// cout<<m<<endl;
for(i=1;i<=m;i++){//Sn
gets(s1[i]);
flag1 = 0;//每一个字母与表比较
for(j=1;j<=n && flag2;j++){//遍历相同
if(strcmp(s1[i],biao[j])==0){
vis[i] = j; //biao里第j个字符串
flag1 = 1;
break;
}
}
if(!flag1){//不存在
strcpy(ss[count++],s1[i]);
flag2 = 0;
}
}
//printf
for(i=1;i<=1&&!flag2;i++){//不同
printf("%s",ss[1]);
if(i==1) printf(" not in dictionary.\n");
}
for(i=1;i<=m&&flag2;i++){//相同
printf("%s",s[vis[i]]);
if(i!=m) printf(" ");
else{
printf("\n");
}
}
}
return 0;
}