import java.io.*; class Bug ...{ staticboolean finish,hash[],used[]; staticint n,stk[]=newint[27]; static String a,b,c,word; publicstaticvoid main(String args[])throws Exception ...{ BufferedReader bf=new BufferedReader(new FileReader("bug.in")); while(bf.ready()) ...{ n=Integer.parseInt(bf.readLine()); a=bf.readLine(); b=bf.readLine(); c=bf.readLine(); finish=false; pre_doing(); dfs(0); } } publicstaticvoid pre_doing() ...{ word=""; hash=newboolean[256];//字母映射表 for(int i=n-1;i>=0;i--)...{ addup(a.charAt(i));addup(b.charAt(i));addup(c.charAt(i)); } used=newboolean[27]; } publicstaticvoid dfs(int l)...{ int i; String A,B,C; if(finish)return; if(bad())return; if(modcheck())return; if(l==n)...{ outsol(); return; } for(i=n-1;i>=0;i--) if(!used[i])...{ used[i]=true;A=a;B=b;C=c; a=change(A,word.charAt(l),i); b=change(B,word.charAt(l),i); c=change(C,word.charAt(l),i); stk[l]=i; dfs(l+1); used[i]=false;a=A;b=B;c=C; } } publicstaticboolean bad()...{ int p, g =0; for (int i = n -1; i >=0; i --) ...{ if (a.charAt(i) >= n || b.charAt(i) >= n || c.charAt(i) >= n) returnfalse;//字符串没有完全数字化 p = a.charAt(i) + b.charAt(i) + g; if (p % n != c.charAt(i)) returntrue; g = p / n; } returnfalse; } publicstaticboolean modcheck() ...{ int i, p, p1, p2; //a + b = c, all know for (i = n -1; i >=0; i --) ...{ if (a.charAt(i) >= n || b.charAt(i) >= n || c.charAt(i) >= n) continue; p = (a.charAt(i) + b.charAt(i)) % n; if (!(p == c.charAt(i) || (p +1) % n == c.charAt(i))) returntrue; } //a + ? = c for (i = n -1; i >=0; i --) ...{ if (!(a.charAt(i) < n && c.charAt(i) < n && b.charAt(i) >= n)) continue; p1 = (c.charAt(i) - a.charAt(i) + n) % n; p2 = (p1 -1) % n; if (used[p1] && used[p2]) returntrue; } //? + b = c for (i = n -1; i >=0; i --) ...{ if (!(a.charAt(i) >= n && c.charAt(i) < n && b.charAt(i) < n)) continue; p1 = (c.charAt(i) - b.charAt(i) + n) % n; p2 = (p1 -1) % n; if (used[p1] && used[p2]) returntrue; } //a + b = ? for (i = n -1; i >=0; i --) ...{ if (!(a.charAt(i) < n && b.charAt(i) < n && c.charAt(i) >= n)) continue; p1 = (a.charAt(i) + b.charAt(i)) % n; p2 = (p1 +1) % n; if (used[p1] && used[p2]) returntrue; } returnfalse; } publicstatic String change(String str, char x, int y) ...{ for (int i =0; i < n; i ++) if (str.charAt(i) == x) str=str.replace(str.charAt(i) , (char)y); return str; } publicstaticvoid outsol() ...{ int i, ans[]=newint[27]; for (i =0; i < n; i ++) ans[word.charAt(i) -65] = stk[i]; System.out.print(ans[0]); for (i =1; i < n; i ++) System.out.print(""+ans[i]); System.out.println(); finish =true; } publicstaticvoid addup(char ch) ...{ if (!hash[ch]) ...{ hash[ch] =true; word = word + ch; } } }