我的思路是先建树再遍历输出,还没有加边界,建树是根据样例自己找规律推的
ldfs(虽然好像跟dfs没关系)是先找到根节点和根节点左孩子先遍历出左子树,rdfs是根据左子树最后一个节点确定根节点右孩子进行右子树遍历,最后后序遍历输出
在ldfs和rdfs中必须输出换行,否则程序死循环(测评点3没问题,样例死循环),当树中只有一个节点时需要特判
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,kk;
char f[N];
int vis[N];
string sm,sf;
void ldfs(int x,int y){
int tt;
for(int i=1;i<=n;i++){
if(sm[i]==sf[x]){
if(sm[i+1]==sf[0]){
kk=x;
return;
}
tt=i;
}
}
if(sf[x+1]==sm[tt-1]&&vis[sf[x+1]-'A']==0&&vis[sm[tt-1]-'A']==0){
f[2*y]=sf[x+1];
vis[sf[x+1]-'A']=1;
ldfs(x+1,2*y);
}
else if(sf[x+1]==sm[tt+1]&&vis[sf[x+1]-'A']==0&&vis[sm[tt+1]-'A']==0){
f[2*y]=sf[x+1];
vis[sf[x+1]-'A']=1;
ldfs(x+1,2*y+1);
}
else{
f[y+1]=sf[x+1];
vis[sf[x+1]-'A']=1;
ldfs(x+1,y+1);
}
return;
}
void rdfs(int x,int y){
int tt;
for(int i=1;i<=n;i++){
if(sm[i]==sf[x]){
if(sm[i-1]==sf[0]){
return;
}
tt=i;
}
}
if(sf[x+1]==sm[tt-1]&&vis[sf[x+1]-'A']==0&&vis[sm[tt-1]-'A']==0){
f[2*y]=sf[x+1];
vis[sf[x+1]-'A']=1;
rdfs(x+1,2*y);
}
else if(sf[x+1]==sm[tt+1]&&vis[sf[x+1]-'A']==0&&vis[sm[tt+1]-'A']==0){
f[2*y]=sf[x+1];
vis[sf[x+1]-'A']=1;
rdfs(x+1,2*y+1);
}
else{
f[y+1]=sf[x+1];
vis[sf[x+1]-'A']=1;
rdfs(x+1,y+1);
}
return;
}
void print(int x){
if(f[2*x]!='0'){
print(2*x);
}
if(f[2*x+1]!='0'){
print(2*x+1);
}
cout<<f[x];
return;
}
int main(){
for(int i=1;i<=1e5;i++){
f[i]='0';
}
cin>>sm>>sf;
n=sm.length();
if(n==1){
cout<<sm[0];
return 0;
}
f[1]=sf[0];
vis[sf[0]-'A']=1;
f[2]=sf[1];
vis[sf[1]-'A']=1;
ldfs(1,2);
kk++;
f[3]=sf[kk];
rdfs(kk,3);
// for(int i=1;i<=40;i++){
// cout<<f[i];
// }
print(1);
return 0;
}