代码:
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int p[N],c[N];
vector<int>path[N];
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&p[i]);
for(int i=1;i<=n;i++)
scanf("%d",&c[i]);
for(int i=1;i<=n;i++)
path[i].clear();
int cnt=0;
for(int i=1;i<=n;i++)//找环
{
if(p[i]==-1)
continue;
int t=i;
cnt++;
while(p[t]!=-1)
{
path[cnt].push_back(c[t]);
int tt=p[t];
p[t]=-1;
t=tt;
}
}
int ans=N<<2;
for(int i=1;i<=cnt;i++)
{//cout<<"sz->"<<path[i].size()<<endl;
for(int j=0;j<path[i].size();j++)
{
if(path[i].size()%(j+1))//j+1为因子
continue;
for(int k=0;k<=j;k++)//环起点
{
bool f=1;
for(int u=k;u<path[i].size();u+=(j+1))
{
if(path[i][u]!=path[i][k])
{
f=0;
break;
}
}
if(f)
{
ans=min(ans,j+1);
break;
}
}
}
}
printf("%d
",ans);
}
return 0;
}
博客