比赛 20130729 评测结果 AAAAAAAAAA
题目名称 奶牛的糖果 最终得分 100
用户昵称 天空非翔 运行时间 0.148 s
代码语言 C++ 内存使用 1.82 MiB
提交时间 2014-07-17 09:12:58
显示代码纯文本
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
int N,next[100001],num[100001],go[100001],newcir[100001];
void dfs(int x)
{
	int k=x,deep=0;
	while(!newcir[k]&&!go[k])//没有找到  新环  也没有找到  旧环(链)
	{
		deep++;
		newcir[k]=deep;
		k=next[k];
	}
	if(go[k])//有旧环(链) 此时go[k]即这个环的长度
		deep+=go[k];
	else//新环 此时k为第一次进入环的节点
	{
		int cir=deep+1-newcir[k];
		while(!go[k])//环上点都能绕cir的长度
		{
			go[k]=cir;
			k=next[k];
		}
	}
	k=x;
	while(!go[k])//计算链上节点
	{
		go[k]=deep;
		deep--;
		k=next[k];
	}
}
int main()
{
	freopen("treat.in","r",stdin);
	freopen("treat.out","w",stdout);
	memset(go,0,sizeof(go));
	memset(num,0,sizeof(num));
	memset(newcir,0,sizeof(newcir));
	scanf("%d",&N);
	int i;
	for(i=1;i<=N;i++)
	{
		scanf("%d",&next[i]);
		num[next[i]]++;
	}
	for(i=1;i<=N;i++)
		if(!go[i])
		{
			dfs(i);
		}
	for(i=1;i<=N;i++)printf("%d\n",go[i]);
	return 0;
}