```cpp
#include<iostream>
#include<string>
#include<stack>
#include<queue>
#include<algorithm>
using namespace std;
int n;
string a,b,c;
int f[30];
int d[30];
bool p[30];
bool check1(){
if(d[a[0]-'A']+d[b[0]-'A']>=n)return 0;
for(int i=n-1;i>=0;i--){
int x=d[a[i]-'A'],y=d[b[i]-'A'],z=d[c[i]-'A'];
if(x==-1||y==-1||z==-1)continue;
if((x+y+1)%n!=z&&(x+y)%n!=z){return 0;}
}
return 1;
}
bool check2(){
int ans=0;
for(int i=n-1;i>=0;i--){
int x=d[a[i]-'A'],y=d[b[i]-'A'],z=d[c[i]-'A'];
if((ans+x+y)%n!=z){return 0;}
ans=(x+y+ans)/n;
}
return 1;
}
bool dfs(int idx){
if(!check1())return 0;
if(idx>=n&&check2()){
for(int i=0;i<n;i++){
cout<<d[i]<<" ";
}return 1;
}
for(int i=n-1;i>=0;i--){
if(!p[i]){
p[i]=1;
d[f[idx]]=i;
if(dfs(idx+1))return 1;
d[f[idx]]=-1;
p[i]=0;
}
}
return 0;
}
int main() {
for(int i=0;i<26;i++)d[i]=-1;
cin>>n;
cin>>a>>b>>c;
int x=0;
bool pan[30]={0};
for(int i=n-1;i>=0;i--){
if(!pan[c[i]-'A']){
f[x]=c[i]-'A';pan[c[i]-'A']=1;x++;
}
if(!pan[b[i]-'A']){
f[x]=b[i]-'A';pan[b[i]-'A']=1;x++;
}
if(!pan[a[i]-'A']){
f[x]=a[i]-'A';pan[a[i]-'A']=1;x++;
}
}
dfs(0);
return 0;
}
```
by hahahahahahahah @ 2021-07-29 19:32:06
```cpp
#include<iostream>
#include<string>
#include<stack>
#include<queue>
#include<algorithm>
using namespace std;
int n;
string a,b,c;
int f[30];
int d[30];
bool p[30];
bool check1(){
if(d[a[0]-'A']+d[b[0]-'A']>=n)return 0;
for(int i=n-1;i>=0;i--){
int x=d[a[i]-'A'],y=d[b[i]-'A'],z=d[c[i]-'A'];
if(x==-1||y==-1||z==-1)continue;
if((x+y+1)%n!=z&&(x+y)%n!=z){return 0;}
}
return 1;
}
bool check2(){
int ans=0;
for(int i=n-1;i>=0;i--){
int x=d[a[i]-'A'],y=d[b[i]-'A'],z=d[c[i]-'A'];
if((ans+x+y)%n!=z){return 0;}
ans=(x+y+ans)/n;
}
return 1;
}
bool dfs(int idx){
if(!check1())return 0;
if(idx>=n&&check2()){
for(int i=0;i<n;i++){
cout<<d[i]<<" ";
}return 1;
}
for(int i=n-1;i>=0;i--){
if(!p[i]){
p[i]=1;
d[f[idx]]=i;
if(dfs(idx+1))return 1;
d[f[idx]]=-1;
p[i]=0;
}
}
return 0;
}
int main() {
for(int i=0;i<26;i++)d[i]=-1;
cin>>n;
cin>>a>>b>>c;
int x=0;
bool pan[30]={0};
for(int i=n-1;i>=0;i--){
if(!pan[a[i]-'A']){
f[x]=a[i]-'A';pan[a[i]-'A']=1;x++;
}
if(!pan[c[i]-'A']){
f[x]=c[i]-'A';pan[c[i]-'A']=1;x++;
}
if(!pan[b[i]-'A']){
f[x]=b[i]-'A';pan[b[i]-'A']=1;x++;
}
}
dfs(0);
return 0;
}
```
by hahahahahahahah @ 2021-07-29 19:32:46
```cpp
if(!pan[c[i]-'A']){
f[x]=c[i]-'A';pan[c[i]-'A']=1;x++;
}
if(!pan[b[i]-'A']){
f[x]=b[i]-'A';pan[b[i]-'A']=1;x++;
}
if(!pan[a[i]-'A']){
f[x]=a[i]-'A';pan[a[i]-'A']=1;x++;
}
if(!pan[a[i]-'A']){
f[x]=a[i]-'A';pan[a[i]-'A']=1;x++;
}
if(!pan[c[i]-'A']){
f[x]=c[i]-'A';pan[c[i]-'A']=1;x++;
}
if(!pan[b[i]-'A']){
f[x]=b[i]-'A';pan[b[i]-'A']=1;x++;
}
```
by hahahahahahahah @ 2021-07-29 19:34:31
@[hahahahahahahah](/user/504778) 两个的区别就只有这里不一样 也就是一个是从上到下 一个是从下到上的区别 运行速度差距怎么这么大呢
by hahahahahahahah @ 2021-07-29 19:36:23
@[hahahahahahahah](/user/504778) 我看了下你的提交,你 TLE 提交和 AC 提交之间的区别不是这里,是 dfs 的枚举顺序,倒序就过了
为什么倒序就能过,这个我不太知道
by WYXkk @ 2021-07-29 19:52:52
@[WYXkk](/user/130151) 不是 你看我的第三次提交和第二次提交的区别.第一次确实是因为倒序TLE了
by hahahahahahahah @ 2021-07-29 22:08:05
@[WYXkk](/user/130151) 就是那个90分和100的
by hahahahahahahah @ 2021-07-29 22:12:12