首先给个代码:
#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 卡了,找了很多资料无解,请问出了什么问题?