求助,并查集模拟,最后两个点t了
  • 板块P2814 家谱
  • 楼主hh弟中弟
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/8/18 09:20
  • 上次更新2023/10/27 14:50:29
查看原帖
求助,并查集模拟,最后两个点t了
366639
hh弟中弟楼主2022/8/18 09:20


#include<bits/stdc++.h>
using namespace std;
int n=1,m,father[50005];
string name[50005];
int wz(string s){
	for(int i=1;i<=n;i++){
		if(s.substr(1,s.size()-1)==name[i].substr(1,name[i].size()-1))
		return i;
	}
}
int find(int x){
	if(father[x]!=x)father[x]=find(father[x]);
	return father[x];
}
void unionn(int x,int y){
	x=find(x);
	father[y]=x; 
}
int main(){
	for(int i=1;i<=50005;i++)father[i]=i;
	char bz;
	while(1){
		int die,w;cin>>name[n];
		string s=name[n];
		if(s[0]=='#'){
			die=n;father[n]=father[wz(s)];//wz(s);
		}
		if(s[0]=='+'){
			unionn(die,wz(s));father[n]=father[wz(s)];
		}
		if(s[0]=='?'){
			
			bool y=0;
			for(int i=1;i<=n;i++)find(i);
		//	for(int i=1;i<=n;i++)cout<<father[i]<<endl;
			while(1){
				if(y)cin>>s;y=1;
				if(s[0]=='$')return 0; 
				for(int i=1;i<s.size();i++)cout<<s[i];cout<<' ';
				s=name[father[(wz(s))]];
				for(int i=1;i<s.size();i++)cout<<s[i];cout<<endl;
			}
		}
	//	cout<<wz(s)<<' '<<father[n]<<endl;
		n++;
	}
}
2022/8/18 09:20
加载中...