|
- #include<iostream>
- #include<algorithm>
- #include<cstdio>
- #include<string>
- using namespace std;
- #define FOR(i,n,m) for(int i=n;i<=m;i++)
- #define For(i,n,m) for(int i=n;i>=m;i--)
- string s1,s2,s3;
- int n,word[30],t,a[30],b[30],c[30],num[30];
- bool bb[30];
- void doit(int x)
- {
- if(!bb[x])
- {
- word[t++]=x;
- bb[x]=1;
- }
- }
- bool judge(){
- for(int i=n-1,x=0;i>=0;i--){
- int A=num[a[i]],B=num[b[i]],C=num[c[i]];
- if((A+B+x)%n!=C) return 0;
- x=(A+B+x)/n;
- }
- return 1;
- }
- bool prune(){
- if(num[a[0]]+num[b[0]]>=n) return 1;
- for(int i=n-1;i>=0;i--){
- int A=num[a[i]],B=num[b[i]],C=num[c[i]];
- if(A==-1||B==-1||C==-1) continue;
- if((A+B)%n!=C&&(A+B+1)%n!=C) return 1;
- }return 0;
- }
- void dfs(int x)
- {
- if(prune()) return;
- if(x==n){
- if(judge()) {
- FOR(i,0,n-1) cout<<num[i]<<" ";
- exit(0);
- }
- return;
- }
- for(int i=n-1;i>=0;i--)
- if(!bb[i]){
- num[word[x]]=i;
- bb[i]=1;
- dfs(x+1);
- num[word[x]]=-1;
- bb[i]=0;
- }
- return;
- }
- int main()
- {
- cin>>n;cin>>s1>>s2>>s3;
- FOR(i,0,n-1) a[i]=s1[i]-'A',b[i]=s2[i]-'A',c[i]=s3[i]-'A';
- For(i,n-1,0) doit(a[i]),doit(b[i]),doit(c[i]);
- FOR(i,0,27) bb[i]=0;FOR(i,0,27) num[i]=-1;
- dfs(0);
- return 0;
- }
复制代码 |
|