带权并查集
有蜘蛛纸牌内味。
code:
#include<bits/stdc++.h>
using namespace std;
int T,a,bb,fa[30001],b[30001],s[30001];
char ch;
int fd(int x){
if(x==fa[x])
return x;
int tp=fa[x];
fa[x]=fd(fa[x]);
s[x]+=s[tp];
return fa[x];
}
int main(){
cin>>T;
for(int i=1;i<=30000;i++)
fa[i]=i,b[i]=1;
while(T--){
cin>>ch;
scanf("%d%d",&a,&bb);
int faa=fd(a),fbb=fd(bb);
if(ch=='M'){
fa[faa]=fbb;
s[faa]+=b[fbb];
b[fbb]+=b[faa];
}
else{
if(faa!=fbb)
printf("-1\n");
else
printf("%d\n",abs(s[a]-s[bb])-1);
}
}return 0;
}