```cpp
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=30000;
int sum[N+1];
int under[N+1];
int f[N+1];
int p;
int cnt;
int ans[1000001];
int getf(int num)
{
if(num==f[num])
{
return num;
}
int t=getf(f[num]);
under[num]+=under[f[num]];
f[num]=t;
return f[num];
}
void merge(int a,int b)
{
int t1=getf(a);
int t2=getf(b);
if(t1!=t2)
{
f[t2]=t1;
under[t2]=sum[t1];
sum[t1]+=sum[t2];
}
}
int main()
{
//freopen("testdata.in","r",stdin);
//freopen("testme.out","w",stdout);
for(int i=1;i<=N;i++)
{
sum[i]=1;
under[i]=0;
f[i]=i;
}
scanf("%d",&p);
for(int i=1;i<=p;i++)
{
char miao;
scanf("%c",&miao);
scanf("%c",&miao);
if(miao=='M')
{
int x,y;
scanf("%d%d",&x,&y);
merge(y,x);
}
else
{
if(miao=='C')
{
int x,y;
scanf("%d%d",&x,&y);
if(getf(f[x])!=getf(f[y]))
{
printf("-1\n");
}
else
{
getf(x);
getf(y);
printf("%d\n",abs(under[x]-under[y]+1));
}
}
}
}
return 0;
}
```
by Brandon鹏 @ 2018-07-28 09:14:53
不知道为什么现在在顶层发代码总是出一些莫名其妙的问题。
by Brandon鹏 @ 2018-07-28 09:16:03
您有没有输出一些细小的,您都没有察觉的换行或者诡异的字符?
by МiсDZ @ 2018-07-28 09:16:57
@[Brandon鹏](/space/show?uid=86154) `scanf("%c",&miao)`换成cin或`scanf("\n%c",&miao)`试试,scanf读入单个字符容易出锅...
by happyZYM @ 2018-07-28 09:20:33
输入两遍miao 你的用意是什么
不同系统下的换行符有不同格式。
建议用`char miao2[5]; scanf("%s",miao2); miao=miao2[0];`
by 小粉兔 @ 2018-07-28 09:21:35
@[happyZYM](/space/show?uid=87248)
scanf不是不能用\n的吗
蒟蒻求教
by _Felix @ 2018-07-28 09:24:40
`scanf("%c",&miao)`是直接读入当前字符,无论是空格 换行符还是任何不可见字符。
在win下 换行符是`\n`(ASCII=13)。但是在Linux下,换行符似乎是`'\r'+'\n'`?(ASCII=10)
所以为了防止多系统格式不同,直接`scanf("%s")`就好了
by 小粉兔 @ 2018-07-28 09:28:17
@[最亮的星—喵](/space/show?uid=106738) scanf读入的非格式字符串部分相当于一个阉割版正则表达式,一般情况下scanf是不吞换行符的....
by happyZYM @ 2018-07-28 09:29:28
@[小粉兔](/space/show?uid=10703) win是'\r\n',Linux是'\n',但以文本文件模式读入时操作系统(c语言的IO?)会自动把它们同一成'\n'(也就是你程序读到的是'\n')
by happyZYM @ 2018-07-28 09:32:22
@[happyZYM](/space/show?uid=87248)
dadalao您您刚刚刚才说说什什么么么?
我我我听听不不不懂。。。
哭,这种dalao的讨论以后还是少来了。。。
by _Felix @ 2018-07-28 09:32:31