```cpp
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,ans[101];
char a[101],b[101],c[101];
bool vis[101];
void dfs(int x,int jw){
if(!x){
if(jw)return;
for(int i=1;i<=n;i++){
printf("%d ",ans[i]);
}
exit(0);
}
if(ans[a[x]-'A'+1]==-1 and ans[b[x]-'A'+1]==-1){
if(a[x]==b[x]){
for(int i=0;i<n;i++){
if(!vis[i]){
bool flag=1;
vis[i]=1;
ans[a[x]-'A'+1]=i;
if(ans[c[x]-'A'+1]!=-1 and (i+i+jw)%n!=ans[c[x]-'A'+1]){
vis[i]=0,ans[a[x]-'A'+1]=-1;
continue;
}
if(vis[(i+i+jw)%n] and ans[c[x]-'A'+1]==-1){
vis[i]=0,ans[a[x]-'A'+1]=-1;
continue;
}
if(ans[c[x]-'A'+1]==-1)ans[c[x]-'A'+1]=(i+i+jw)%n,flag=0,vis[(i+i+jw)%n]=1;
dfs(x-1,(i+i+jw)/n);
if(!flag)ans[c[x]-'A'+1]=-1,vis[(i+i+jw)%n]=0;
ans[i]=-1;
vis[i]=0;
}
}
} else {
for(int i=0;i<n;i++){
if(!vis[i]){
for(int j=0;j<n;j++){
if(vis[j] or i==j)continue;
bool flag=1;
vis[i]=vis[j]=1;
ans[a[x]-'A'+1]=i;
ans[b[x]-'A'+1]=j;
if(ans[c[x]-'A'+1]!=-1 and (i+j+jw)%n!=ans[c[x]-'A'+1]){
ans[a[x]-'A'+1]=ans[b[x]-'A'+1]=-1;
vis[i]=vis[j]=0;
continue;
}
if(vis[(i+j+jw)%n] and ans[c[x]-'A'+1]==-1){
ans[a[x]-'A'+1]=ans[b[x]-'A'+1]=-1;
vis[i]=vis[j]=0;
continue;
}
if(ans[c[x]-'A'+1]==-1)ans[c[x]-'A'+1]=(i+j+jw)%n,flag=0,vis[(i+j+jw)%n]=1;
dfs(x-1,(i+j+jw)/n);
if(!flag)ans[c[x]-'A'+1]=-1,vis[(i+j+jw)%n]=0;
ans[a[x]-'A'+1]=ans[b[x]-'A'+1]=-1;
vis[i]=vis[j]=0;
}
}
}
}
} else if(ans[a[x]-'A'+1]==-1){
for(int i=0;i<n;i++){
if(!vis[i]){
bool flag=1;
vis[i]=1;
ans[a[x]-'A'+1]=i;
if(ans[c[x]-'A'+1]!=-1 and (i+ans[b[x]-'A'+1]+jw)%n!=ans[c[x]-'A'+1]){
ans[a[x]-'A'+1]=-1;
vis[i]=0;
continue;
}
if(vis[(i+ans[b[x]-'A'+1]+jw)%n] and ans[c[x]-'A'+1]==-1){
ans[a[x]-'A'+1]=-1;
vis[i]=0;
continue;
}
if(ans[c[x]-'A'+1]==-1)ans[c[x]-'A'+1]=(i+ans[b[x]-'A'+1]+jw)%n,flag=0,vis[(i+ans[b[x]-'A'+1]+jw)%n]=1;
dfs(x-1,(i+ans[b[x]-'A'+1]+jw)/n);
if(!flag)ans[c[x]-'A'+1]=-1,vis[(i+ans[b[x]-'A'+1]+jw)%n]=0;
ans[a[x]-'A'+1]=-1;
vis[i]=0;
}
}
} else if(ans[b[x]-'A'+1]==-1){
for(int i=0;i<n;i++){
if(!vis[i]){
bool flag=1;
vis[i]=1;
ans[b[x]-'A'+1]=i;
if(ans[c[x]-'A'+1]!=-1 and (i+ans[a[x]-'A'+1]+jw)%n!=ans[c[x]-'A'+1]){
ans[b[x]-'A'+1]=-1;
vis[i]=0;
continue;
}
if(vis[(i+ans[a[x]-'A'+1]+jw)%n] and ans[c[x]-'A'+1]==-1){
ans[b[x]-'A'+1]=-1;
vis[i]=0;
continue;
}
if(ans[c[x]-'A'+1]==-1)ans[c[x]-'A'+1]=(i+ans[a[x]-'A'+1]+jw)%n,vis[(i+ans[a[x]-'A'+1]+jw)%n]=1,flag=0;
dfs(x-1,(i+ans[a[x]-'A'+1]+jw)/n);
if(!flag)ans[c[x]-'A'+1]=-1,vis[(i+ans[a[x]-'A'+1]+jw)%n]=0;
ans[b[x]-'A'+1]=-1;
vis[i]=0;
}
}
}else {
bool flag=1;
int xx=ans[b[x]-'A'+1],yy=ans[a[x]-'A'+1];
if(ans[c[x]-'A'+1]!=-1){
if((xx+yy+jw)%n!=ans[c[x]-'A'+1])return;
} else {
if(vis[(xx+yy+jw)%n])return;
ans[c[x]-'A'+1]=(xx+yy+jw)%n;
vis[(xx+yy+jw)%n]=1;
flag=0;
}
dfs(x-1,(xx+yy+jw)/n);
if(!flag)ans[c[x]-'A'+1]=-1,vis[(xx+yy+jw)%n]=0;
}
}
int main(){
memset(ans,-1,sizeof(ans));
scanf("%d",&n);
scanf("%s%s%s",a+1,b+1,c+1);
dfs(n,0);
return 0;
}
```
by ezoiHY @ 2018-10-29 13:24:28
$\sf I\color{#f8f8f9}\colorbox{#f8f8f9}{WApD3}\color{black}AK IOI$
I[ ](https://www.luogu.org/space/show?uid=106955)AK IOI
by Sunrule @ 2018-10-29 13:42:10