rt
WA on 1 2 4 6 10
#include<bits/stdc++.h>
using namespace std;
const int maxn = 150;
const int seed = 993244853;
typedef unsigned long long hs;
class tree{
public:
int fa[maxn], size[maxn], weight[maxn];
hs hashval[maxn];
vector<int> E[maxn];
int centroid[2], n, root;
int ansCentroid[2];
void getCent(int crt){
size[crt] = 1;
weight[crt] = 0;
for(auto i:E[crt]){
if(i != fa[crt]){
getCent(i);
size[crt] += size[i];
weight[crt] = max(weight[crt],size[i]);
}
}
weight[crt] = max(weight[crt],n - size[crt]);
if(weight[crt] <= n/2)
centroid[centroid[0] != 0] = crt;
}
void gethash(int crt){
hs lis[maxn];
size[crt] = 1;
for(auto i:E[crt]){
if(i!=fa[crt]){
fa[i] = crt;
gethash(i);
size[crt] += size[i];
}
}
int cnt = 0;
for(auto i:E[crt]){
if(i != fa[crt])lis[cnt++] = hashval[i];
}
std::sort(lis,lis+cnt);
hs val = 0;
for(int i = 0;i<cnt;++i)
val = val*seed + lis[i];
hashval[crt] = val ? val*size[crt] : 1;
}
tree(){
centroid[0] = centroid[1] = 0;
cin >> n;
for(int i = 1;i<=n;++i){
int f;
cin >> f;
if(f){
fa[i] = f;
E[f].push_back(i), E[i].push_back(f);
}
else{
root = i;
}
}
getCent(root);
memset(size,0,sizeof(size));
memset(fa,0,sizeof(fa));
gethash(centroid[0]);
ansCentroid[0] = hashval[centroid[0]];
if(centroid[1]){
memset(size,0,sizeof(size));
memset(fa,0,sizeof(fa));
ansCentroid[1] = hashval[centroid[1]];
}
}
};
hs anspair[maxn][3];
map<pair<pair<hs,hs>,int>, int> ans;
signed main(){
int m;
cin >> m;
for(int i = 1;i<=m;++i){
tree T;
hs Tfst = T.ansCentroid[0], Tsec = T.ansCentroid[1];
if(Tfst<Tsec)Tfst ^= Tsec ^= Tfst ^= Tsec;
if(ans[make_pair(make_pair(Tfst,Tsec),T.n)]==0)ans[make_pair(make_pair(Tfst,Tsec),T.n)] = i;
anspair[i][0] = Tfst,anspair[i][1] = Tsec;
anspair[i][2] = T.n;
}
for(int i = 1;i<=m;++i){
cout << ans[make_pair(make_pair(anspair[i][0],anspair[i][1]),anspair[i][2])] << '\n';
}
return 0;
}