终于不再WA了,但是MLE了一片。。。
#include<stdio.h>
#include<algorithm>
#include<map>
struct int128{
unsigned long long a,b;
int128 operator <<(const size_t&o)const{
return (o<64)?(int128){a<<o|b>>64-o,b<<o}:(int128){b<<o-64,0};
}
int128 operator |(const int128&o)const{
return (int128){a|o.a,b|o.b};
}
bool operator <(const int128&o)const{
return a==o.a?b<o.b:a<o.a;
}
}name[51];int size[51],head[51],m,n;
void print(unsigned long long x,int cnt){
if(cnt){
print(x>>1,cnt-1);
putchar((x&1)^48);
}
}
void print(int128 x,int cnt){
if(cnt>64)print(x.a,cnt-64),print(x.b,64);
else print(x.b,cnt);
}
struct{int v,nxt;}e[51];
inline bool cmp(int a,int b){return name[a]<name[b];}
void dfs(int x,int f){
static int a[51];int tot=0;size[x]=1;name[x]={0,0};
for(int i=head[x];~i;i=e[i].nxt)
if(e[i].v!=f){
dfs(e[i].v,x);
size[x]+=size[e[i].v];
}
for(int i=head[x];~i;i=e[i].nxt)if(e[i].v!=f)a[tot++]=e[i].v;
std::sort(a,a+tot,cmp);
for(int i=0;i<tot;++i)name[x]=name[x]<<(size[a[i]]<<1)|name[a[i]];
name[x]=name[x]<<1|(int128){0,1};
}
int cent[2],tot;
void query(int x,int f){
size[x]=1;
for(int i=head[x];~i;i=e[i].nxt)
if(e[i].v!=f){
query(e[i].v,x);
size[x]+=size[e[i].v];
weight=size[e[i].v]>weight?size[e[i].v]:weight;
}
if((weight<<1)<=n&&n<=(size[x]<<1))cent[tot++]=x;
}
int main(){
std::map<int128,int> MAP;
scanf("%d",&m);
for(int k=1;k<=m;++k){
scanf("%d",&n);
for(int i=1;i<=n;++i)head[i]=-1;tot=0;
int cnt=0;
for(int i=1;i<=n;++i){
int x;scanf("%d",&x);
if(x){
e[cnt]={x,head[i]},head[i]=cnt++;
e[cnt]={i,head[x]},head[x]=cnt++;
}
}
query(1,0);
int128 NAME={0xffffffffffffffffull,0xffffffffffffffffull};
for(int i=0;i<tot;++i){
dfs(cent[i],0);
if(name[cent[i]]<NAME)NAME=name[cent[i]];
}
if(MAP.find(NAME)!=MAP.end())printf("%d\n",MAP[NAME]);
else printf("%d\n",MAP[NAME]=k);
}
return 0;
}