题目:
数学上,一个N个数的排列可以看成到自身的一个置换。
例如 置换( 3 4 5 2 1 )表示:
第1个数置换到第3个;
第2个数置换到第4个;
第3个数置换到第5个;
第4个数置换到第2个;
第5个数置换到第1个;
如果原始的数列是: 1 2 3 4 5,则使用一次置换( 3 4 5 2 1 )后变为:5 4 1 2 3;如果再次使用置换( 3 4 5 2 1 )则变为:3 2 5 4 1;多次置换的结果如下:
输入:
5
5 3 2 1 4
输出:
3 2 2 3 3
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,a[1000002],b[1000002];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
{
if(b[i]==0)
{
int pos=i;
int c=0;
while(1)
{
pos=a[pos];
c++;
if(pos==i) break;
}
pos=i;
while(1)
{
pos=a[pos];
b[pos]=c;
if(pos==i) break;
}
}
}
for(int i=1;i<=n;i++)
cout<<b[i]<<" ";
return 0;
}