求救,离奇错误,闹鬼现场

P1196 [NOI2002] 银河英雄传说

```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


| 下一页