您的位置:首页 > 其它

HDU 3234 Exclusive-OR 扩展并查集

2011-12-13 18:53 316 查看
这个题坑了我两小时,查了半天,最后发现自己一直都弄错了运算符的优先性。val[p]^val[q]!=v是错的,应该写成((val[p]^val[q])!=v),异或运算符优先性比关系运算符==低
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int root[20010],val[20010],temp[20],xor[20],roo[20];
int n,Q;

int query(int x){
int tem;
if(root[x]!=x){
tem=root[x];
root[x] = query(root[x]);
val[x]=val[x]^val[tem];
}
return root[x];
}

void Union(int x,int y,int Val){
int tem1,tem2;
tem1=query(x);
tem2=query(y);
if(tem1==n){
swap(tem1,tem2);
}
root[tem1]=tem2;
val[tem1]=val[x]^val[y]^Val;
}

int main(){
int l,i,j,k,p,q,v,flag,fa1,fa2,sign,cas,boo,fact;
int num,in,tem,all,ans;
char a[10240],str[10240];
cas=0;
while(scanf("%d %d",&n,&Q)==2 && !(n==0 && Q==0)){
fact=0;
printf("Case %d:\n",++cas);
for(i=0;i<=n;i++)
root[i]=i;
memset(val,0,sizeof(val));
flag=0;
for(l=1;l<=Q;l++){
scanf("%s",a);
if(flag){gets(str);continue;}
if(a[0]=='I'){
fact++;
gets(str);
int t=sscanf(str,"%d%d%d",&p,&q,&v);
if(t==2){
swap(q,v);
q=n;
}
fa1=query(p);
fa2=query(q);
if(fa1==fa2){
if((val[p]^val[q])!=v)
if(!flag){
flag=1;
printf("The first %d facts are conflicting.\n", fact);
}
}
else if(fa1!=fa2){
Union(p,q,v);
}

}
else{
scanf("%d",&num);
all=0;
memset(xor,0,sizeof(xor));
memset(roo,0,sizeof(roo));
memset(temp,0,sizeof(temp));
for(j=1;j<=num;j++){
scanf("%d",&in);
tem=query(in);
if(j!=1){
for(k=1;k<=all;k++){
if(roo[k]==tem)
break;
}
}
if(j==1 || k==all+1){
temp[++all]=1;
roo[all]=tem;
xor[all]=val[in];
}
else{
temp[k]++;
xor[k]^=val[in];
}
}
ans=0;
if(flag)
continue;
sign=0;
for(i=1;i<=all;i++){
if(temp[i]%2==1 && roo[i]!=n){
printf("I don't know.\n");
sign=1;
break;
}
ans^=xor[i];
}
if(!sign)
printf("%d\n",ans);
}
}
puts("");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: