记录编号 126839 评测结果 AAAAAAAAAA
题目名称 [USACO Dec08] 奶牛的糖果 最终得分 100
用户昵称 Gravatar水中音 是否通过 通过
代码语言 C++ 运行时间 0.135 s
提交时间 2014-10-14 12:11:41 内存使用 1.55 MiB
显示代码纯文本
//stack的模拟
//记忆化搜索 

#include<iostream>
#include<cstdio>
using namespace std;
int tu[100010]={0},nz[100010]={0},zhi[100010]={0},n,zj1,zj2,zj3,i,p;
bool pan[100010]={0};
void init()
{
	scanf("%d",&n);
	for(i=1;i<=n;i++)scanf("%d",&tu[i]);
}
void A_find()
{
	for(i=1;i<=n;i++)
	if(!pan[i])//没有判断过 
	{
		nz[0]=1;nz[1]=i;//栈初始化 
		pan[i]=true;//标记 
		zj1=i;
		while(!pan[ tu[zj1] ])//遇到判断过的点后跳出 
		{
			nz[0]++;//计数 
			nz[ nz[0] ]=tu[zj1];//入栈 
			zj1=tu[zj1];
			pan[zj1]=true;
		}
		//假如有标记但无值,代表栈里面环的存在 , 
		if(zhi[ tu[zj1] ])//无环 
		{
			zj1=zhi[ tu[zj1] ];
			zj2=nz[0];
			while(zj2)//栈里元素依次出栈赋值 
			{
				zj1++;
				zhi[ nz[zj2] ]=zj1;
				zj2--;
			}
		}
		else
		{
			zj1=tu[zj1];zj2=nz[0];zj3=1;//寻找环 
			while(nz[zj2]!=zj1){zj3++;zj2--;}//找到环起始点,跳出 
			for(p=zj2;p<=nz[0];p++)zhi[ nz[p] ]=zj3;//环的赋值 
			zj2--;
			while(zj2)//栈里元素依次出栈赋值 
			{
				zhi[ nz[zj2] ]=++zj3;
				zj2--;
			}
		}
	}
}
void End_answer()
{
	for(i=1;i<=n;i++)printf("%d\n",zhi[i]);
}
int main()
{
	freopen("treat.in","r",stdin);
	freopen("treat.out","w",stdout);
	init();
	A_find();
	End_answer();
	return 0;
}