记录编号 8988 评测结果 AAAAAAAAAA
题目名称 [NOI 2002]银河英雄传说 最终得分 100
用户昵称 GravatarBYVoid 是否通过 通过
代码语言 C++ 运行时间 2.493 s
提交时间 2009-02-13 13:20:33 内存使用 0.64 MiB
显示代码纯文本
/* 
 * Problem: NOI2002 galaxy
 * Author: Guo Jiabao
 * Time: 2009.
 * State: Unsolved
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>

using namespace std;
const int MAXN=30001;
class UFS
{
	public:
	struct node{int f,rk,sz;}P[MAXN];
	UFS(int N)
	{
		for (int i=1;i<=N;i++)
			P[i].f=i,P[i].rk=0,P[i].sz=1;
	}
	int getrank(int k,int &root)
	{
		int i,cnt=0,tp=0,path[MAXN];root=k;
		while (P[root].f!=root)
		{
			path[++cnt]=root;
			root=P[root].f;
		}
		for (i=cnt;i>=1;i--)
		{
			tp+=P[path[i]].rk;
			P[path[i]].rk=tp;
			P[path[i]].f=root;
		}
		return P[k].rk;
	}
	int Judge(int a,int b)
	{
		int ra,rb,la,lb;
		la=getrank(a,ra);
		lb=getrank(b,rb);
		if (ra!=rb) return -1;
		return la>lb?la-lb-1:lb-la-1;
	}
	void Union(int a,int b) //put a after b
	{
		int ra,rb;
		getrank(a,ra);
		getrank(b,rb);
		P[ra].f=rb;
		P[ra].rk=P[rb].sz;
		P[rb].sz+=P[ra].sz;
	}
};

int T;
UFS U(MAXN);

int main()
{
	freopen("galaxy.in","r",stdin);
	freopen("galaxy.out","w",stdout);
	scanf("%d",&T);
	for (int i=1;i<=T;i++)
	{
		char c=getchar();int a,b;
		while (c==10 || c==13) c=getchar();
		scanf("%d%d",&a,&b);
		if (c=='M')
			U.Union(a,b);
		else
			printf("%d\n",U.Judge(a,b));
	}
	return 0;
}