蒟蒻求助
查看原帖
蒟蒻求助
789564
queenbee楼主2023/12/6 18:11

概括:

我的思路是先建树再遍历输出,还没有加边界,建树是根据样例自己找规律推的

程序思路:

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;
}
2023/12/6 18:11
加载中...