UVA -2232(并查集 + 位运算)

首先,说些关于异或的信息,异或满足交换律和结合律,这为用并查集创造了条件。

又有 a^b= x, b^c=y; a^c=x^y;

本题目有三种操作,两种存,一种查。对于建立并查集时候要维护两个信息,第一个就是当前节点和root异或的值,当前集合是否存在已知量(之需要确保根部知道这个情况就可以,一个集合里有一个一致,那么该集合任一元素都可以通过异或得到)

查的时候分为两种情况,第一种该元素所在集合没有已知值得点,那么这个集合里的元素在要查集合里有且仅有两个该集合才有解。

剩下的元素,一个个算就可以了。

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define rep(i,n) for(int (i)=0;(i)<(n);(i)++)
const int maxn = 51000;
int p[maxn],d[maxn],hav[maxn];
int find(int x){
  if(p[x] == x) return x;
  if(hav[p[x]]==-1){
    hav[p[x]]=hav[x];
  }
  int root=find(p[x]);
  d[x]^=d[p[x]];
  return p[x]=root;
}
int a[maxn],n,m,val[maxn];
void init(){
  rep(i,n){
    p[i]=i; d[i]=0; hav[i]=-1;
  }
}
char str[maxn];
void cal(int& cnt){
  int len = strlen(str);
  rep(i,len){
    if(isdigit(str[i])){
        int j,num=0;
        for(j=i;j=cnt||(i+2


你可能感兴趣的:(数据结构,---,并查集)