给书的过程形成一个循环,每个独立循环内的每个人的书回到自己手中的时间相同
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 2e5+10;
int a[maxn],ans[maxn],book[maxn];
int dfs(int i,int st){
book[i] = 1;
if(book[a[i]]){
return ans[i] = st;
}
return ans[i] = dfs(a[i],st+1);
}
int main(){
int t;
cin >> t;
while(t--){
int n;
cin >> n;
for( int i = 1 ; i <= n ; ++i ){
scanf("%d",&a[i]);
}
memset(ans,0,sizeof(ans));
memset(book,0,sizeof(book));
for( int i = 1 ; i <= n ; ++i ){
if(!book[i]){
dfs(i,1);
}
}
for( int i = 1 ; i < n ; ++i ){
cout << ans[i] << ' ';
}
cout << ans[n] << endl;
}
return 0;
}