// // File: analyse.cc // Author: cteam18 // // Created on November 13, 2011, 10:52 AM // #include #include #include #include #include #include #include #include #include using namespace std; static char u[101]; static char v[101]; static char c[100001]; static int cl; static char key[101]; inline void doset(char *w, map > &A, int kl, int wl) { for(int i=0;i+wl<=cl;i++) { for(int j=0;j > &A, int k) { int wl=0; while(w[wl]!='\0') wl++; for(int kl=1;kl<=k;kl++) { doset(w,A,kl,wl); } return wl; } static char q[100001]; void write(char *v,const char *k) { int i=0; int j=0; while(v[i]!='\0') { q[i]='A'+((v[i]-'A'+k[j]-'A'+1)%26); j++; i++; if(k[j]=='\0') { j=0;; } } q[i]='\0'; } int main(int argc, char** argv) { map > A; map > B; int k; scanf("%d",&k); while(k) { scanf("%s",u); scanf("%s",v); scanf("%s",c); cl=0; while(c[cl]!='\0') cl++; A.clear(); B.clear(); int wu=doset(u,A,k); int wv=doset(v,B,k); map >::iterator ia=A.begin(); map >::iterator ib=B.begin(); set ans; string res="impossible"; // printf("FDEBUG\n"); while(ia!=A.end()&&ib!=B.end()) { if((*ia).first<(*ib).first) { //printf("First: %s\n",(*ia).c_str()); ia++; } else if((*ia).first>(*ib).first) { //printf("Secon: %s\n",(*ib).c_str()); ib++; } else { //printf("Both : %s %s\n",(*ia).c_str(),(*ib).c_str()); list X=ia->second; list Y=ib->second; list::iterator xi=X.begin(); bool GG=false; for(;xi!=X.end()&&!GG;xi++) { for(list::iterator yi=Y.begin();yi!=Y.end();yi++) { if(*xi+wu<=*yi||*yi+wv<=*xi) { GG=true; break; } } } if(GG) { write(c,(*ia).first.c_str()); res="other"; { ans.insert(string(q)); if(ans.size()>1) { res="ambiguous"; break; } } } ia++; ib++; } } if(res=="impossible") printf("impossible\n"); else if(res=="ambiguous") printf("ambiguous\n"); else printf("%s\n",ans.begin()->c_str()); scanf("%d",&k); } return (0); }