真萌新求助树哈希
查看原帖
真萌新求助树哈希
609565
OtterZ楼主2023/10/2 20:53

首先给个代码:

#include<cstdio>
#include<random>
#include<set>
#include<ctime>
#include<vector>
#include<cstring>
using namespace std;
mt19937_64 ssp(198326);
struct playter{
	const unsigned long long user=ssp();
	unsigned long long g(unsigned long long x){
		x^=user;
		x^=(x<<11)*0xe44d53;
		x^=(x>>13)*0x532ac3;
		x^=(x>>7)*0x942b43;
		return x^user;
	}
	size_t operator()(int64_t x)const{
		x^=user;
		x^=(x^(x<<9))*0x662913451;
		x^=(x^(x>>2))*0x1928ea23;
		return x^user;
	}
}p1,p2;
multiset<unsigned long long>mp,mp2;
unsigned long long hash1[100009],orc,hash2[100009],orz;
unsigned long long hs[100009],hs2[100009];
vector<int>e[100009];
void make_hash(const int nk,const int fa){
	hs[nk]=orc;
	hs2[nk]=orz;
	for(int i=0;i<e[nk].size();i++){
		if(e[nk][i]==fa)continue;
		make_hash(e[nk][i],nk);
		hs[nk]+=p1.g(hs[e[nk][i]]);
		hs2[nk]+=p2.g(hs2[e[nk][i]]);
	}
}
void make_hash2(const int nk,const int fa){
	if(fa==0){
		hash1[nk]=hs[nk];
		hash2[nk]=hs2[nk];
	}
	else{
		int o=hash1[fa]-p1.g(hs[nk]);
		hash1[nk]=hs[nk]+p1.g(o);
		o=hash2[fa]-p2.g(hs[nk]);
		hash2[nk]=hs2[nk]+p2.g(o);
	}
	for(int i=0;i<e[nk].size();i++){
		if(e[nk][i]==fa)continue;
		make_hash2(e[nk][i],nk);
	}
}
int n,u,v,l[2]={3,4};
char c[2][5]={"NO\n","YES\n"};
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		mp.clear(),mp2.clear();
		scanf("%d",&n);
		orc=ssp();
		orz=ssp();
		for(int i=1;i<n;i++){
			scanf("%d%d",&u,&v);
			e[u].push_back(v);
			e[v].push_back(u);
		}
		make_hash(1,0);
		make_hash2(1,0);
		for(int i=1;i<=n;i++){
			mp.insert(hash1[i]);
			mp2.insert(hash2[i]);
			e[i].clear();
		}
		for(int i=1;i<n;i++){
			scanf("%d%d",&u,&v);
			e[u].push_back(v);
			e[v].push_back(u);
		}
		make_hash(1,0);
		make_hash2(1,0);
		int flg=1;
		for(int i=1;i<=n;i++)
			e[i].clear();
		for(int i=1;i<=n;i++){
			multiset<unsigned long long>::iterator it1=mp.find(hash1[i]),it2=mp2.find(hash2[i]);
			if(it1!=mp.end())
				mp.erase(it1);
			else
				flg=0;
			if(it2!=mp2.end())
				mp2.erase(it2);
			else
				flg=0;
		}
		fwrite(c[flg],1,l[flg],stdout);
	}
	return 0;
}

这个代码遇到的问题是被 Master Judge 卡了,找了很多资料无解,请问出了什么问题?

2023/10/2 20:53
加载中...