Description

You are not given n non-negative integersX0,X1,...,
Xn-1 less than220, but they do exist, and their values never change.

I'll gradually provide you some facts about them, and ask you some questions.

There are two kinds of facts, plus one kind of question:

Format Meaning
I
p v
I tell you
Xp = v
I
p q v
I tell you
Xp XOR Xq = v
Q
k p1 p2...pk
Please tell me the value of
Xp1 XOR Xp2 XOR...XOR Xpk

Input

There will be at most 10 test cases. Each case begins with two integers
n and Q (1n20,
000, 2Q40,
000). Each of the following lines contains either a fact or a question, formatted as stated above. Thek parameter in the questions will be a positive integer not greater than 15, and thev
parameter in the facts will be a non-negative integer less than220. The last case is followed byn =
Q = 0, which should not be processed.

Output

For each test case, print the case number on its own line, then the answers, one on each one. If you can't deduce the answer for a particular question, from the facts I provide youbefore that question, print ``I don't know.",
without quotes. If thei-th fact (don't count questions)cannot be consistent with
all the facts before that, print ``The firsti facts are conflicting.", then keep silence for everything after that (including facts and questions). Print a blank line after the output of
each test case.

Sample Input

2 6
I 0 1 3
Q 1 0
Q 2 1 0
I 0 2
Q 1 1
Q 1 0
3 3
I 0 1 6
I 0 2 2
Q 2 1 2
2 4
I 0 1 7
Q 2 0 1
I 0 1 8
Q 2 0 1
0 0

Sample Output

Case 1:
I don't know.
3
1
2 Case 2:
4 Case 3:
7
The first 2 facts are conflicting.

题意:

有n(n<=20000)个未知的整数X0,X1,X2...Xn-1,有下面Q个(Q<=40000)操作:

    I p v :告诉你Xp=v

    I p q v :告诉你Xp Xor Xq=v

    Q k p1 p2 … pk : 询问 Xp1 Xor Xp2 .. Xor Xpk。 k不大于15。

    假设当前的I跟之前的有冲突的话,跳出   

思路:并查集题目,深深的感到没好好做并查集的无力感,知道是并查集却不知道怎么下手,说一下思路:

1.对于每次的询问,我们并不须要知道每一个数的大小也能够推出来结果,对于这样的: I p v

的我们能够虚拟一个数xn=0,这样就能够有通式p^q=v,由于p^0=p。

虚根xn是不能变的,它的子孙都有确定的值

2.我们如果偏移量val[i]=x[i]^x[fa[i]],还有熟悉a^b = 1 , b^c = 2 , 那么 a^c = 1^2 = 3,还有异或能够互相转化:a^b=c -> a^b^b=c^b -> a = b^c

3.为什么会用到并查集呢,由于对于同一个集合里的话我们能够通过他们与根的偏移量和根的值来知道两个数的异或结果,这样更方便计算,同一时候计算:Q k x1 .. xk 的时候。就能够转化为:(val[x1]^val[x2]..val[xk])^(x[fa[x1]]^x[fa[x2]]..x[fa[xk]]),然后利用异或偶数次不变的原理推断必须是奇数次才有能够得到结果,推断是不是xn根就是了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
const int MAXN = 20010; int n, m;
int val[MAXN], fa[MAXN]; int find(int x) {
if (x != fa[x]) {
int tmp = fa[x];
fa[x] = find(fa[x]);
val[x] ^= val[tmp];
}
return fa[x];
} int Union(int x, int y, int v) {
int fx = find(x);
int fy = find(y);
if (fx == fy)
return (val[x]^val[y]) == v;
if (fx == n)
swap(fx, fy);
fa[fx] = fy;
val[fx] = val[x]^v^val[y];
return 1;
} int main() {
char str[MAXN];
int p, q, v, k, x;
int cas = 1;
while (scanf("%d%d", &n, &m) != EOF && n+m) {
for (int i = 0; i <= n; i++) {
val[i] = 0;
fa[i] = i;
}
printf("Case %d:\n", cas++);
int facts = 0;
int err = 0;
while (m--) {
scanf("%s", str);
if (str[0] == 'I') {
gets(str);
facts++;
if (err)
continue;
int cnt = sscanf(str, "%d%d%d", &p, &q, &v);
if (cnt == 2) {
v = q;
q = n;
}
if (!Union(p, q, v)) {
err = true;
printf("The first %d facts are conflicting.\n", facts++);
}
} else {
scanf("%d", &k);
int ans = 0;
int is = 1;
map<int, int> mp;
for (int i = 0; i < k; i++) {
scanf("%d", &x);
if (err)
continue;
int f = find(x);
ans ^= val[x];
mp[f]++;
}
if (err)
continue;
map<int, int>::iterator it;
for (it = mp.begin(); it != mp.end(); it++) {
if (it->second % 2) {
if (it->first != n) {
is = 0;
break;
}
else ans ^= val[it->first];
}
}
if (is)
printf("%d\n", ans);
else printf("I don't know.\n");
}
}
printf("\n");
}
return 0;
}

UVA - 12232 Exclusive-OR (并查集扩展偏离向量)的更多相关文章

  1. UVA 12232 Exclusive-OR(并查集+思想)

    题意:给你n个数,接着三种操作: I p v :告诉你 Xp = v I p q v :告诉你 Xp ^ Xq = v Q k p1 p2 … pk:问你k个数连续异或的结果 注意前两类操作可能会出现 ...

  2. POJ 1182 (经典食物链 /并查集扩展)

    (參考他人资料) 向量偏移--由"食物链"引发的总结 http://poj.org/problem?id=1182这道食物链题目是并查集的变型.非常久曾经做的一次是水过的,这次 ...

  3. UVA 11987 - Almost Union-Find(并查集)

    UVA 11987 - Almost Union-Find 题目链接 题意:给定一些集合,操作1是合并集合,操作2是把集合中一个元素移动到还有一个集合,操作3输出集合的个数和总和 思路:并查集,关键在 ...

  4. POJ 2492 并查集扩展(判断同性恋问题)

    G - A Bug's Life Time Limit:10000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u S ...

  5. UVA - 1197 (简单并查集计数)

    Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, was recognized ...

  6. UVA 10158 War(并查集)

    //思路详见课本 P 214 页 思路:直接用并查集,set [ k ]  存 k 的朋友所在集合的代表元素,set [ k + n ] 存 k  的敌人 所在集合的代表元素. #include< ...

  7. UVA - 11987 Almost Union-Find 并查集的删除

    Almost Union-Find I hope you know the beautiful Union-Find structure. In this problem, you're to imp ...

  8. uva 6910 - Cutting Tree 并查集的删边操作,逆序

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  9. UVA - 208 Firetruck(并查集+dfs)

    题目: 给出一个结点d和一个无向图中所有的边,按字典序输出这个无向图中所有从1到d的路径. 思路: 1.看到紫书上的提示,如果不预先判断结点1是否能直接到达结点d,上来就直接dfs搜索的话会超时,于是 ...

随机推荐

  1. Unicode 字符集与它的编码方式

    正式内容開始之前,我们先来了解一个基本概念,编码字符集. 编码字符集:编码字符集是一个字符集,它为每个字符分配一个唯一数字.Unicode 标准的核心是一个编码字符集,字母"A"的 ...

  2. Swift - 属性观察者(willSet与didSet)

    属性观察者,类似于触发器.用来监视属性的除初始化之外的属性值变化,当属性值发生改变时可以对此作出响应.有如下特点: 1,不仅可以在属性值改变后触发didSet,也可以在属性值改变前触发willSet. ...

  3. 使用GDI+绘制的360风格按钮控件(使用CN_DRAWITEM消息重绘,并使用TGPGraphics,TGPPen,TGPImage,TGPBitmap等)good

    将下面的代码拷贝到一个单元中,创建一个包,加入这个单元后安装.使用的时候设置好背景颜色,边框颜色,图标(png格式)相对路径的文件名称.这个控件可以利用PNG图像的颜色透明特性,背景色默认透明度为50 ...

  4. 14.5.4 InnoDB File-Per-Table Tablespaces 每个表一个文件

    14.5.4 InnoDB File-Per-Table Tablespaces 每个表一个文件 从历史上看, 所有的InnoDB 表和索引是存储在system 表空间, 这个整体的方法是针对机器专注 ...

  5. 调整Tomcat的并发线程到5000+

    调整Tomcat的并发线程数到5000+ 1. 调整server.xml的配置 先调整maxThreads的数值,在未调整任何参数之前,默认的并发线程可以达到40. 调整此项后可以达到1800左右. ...

  6. [Android学习笔记]ShareSDK的使用

    ShareSDK使用方便,集成简单,正式客户端开发人员的首选组件 集成步骤,使用说明见官方文档: http://wiki.sharesdk.cn/Android_快速集成指南 记录: 直接使用官方De ...

  7. linux内核函数之 blk_plug

    分析: /* * blk_plug permits building a queue of related requests by holding the I/O * fragments for a ...

  8. 2014辽宁省赛 Repeat Number

    问题 C: Repeat Number 时间限制: 1 Sec  内存限制: 128 MB [cid=1073&pid=2&langmask=0">提交][状态][论坛 ...

  9. 因特网的IP协议是不可靠无连接的,那为什么当初不直接把它设计为可靠的?

    因特网使用的IP协议是无连接的,因此其传输是不可靠的. 这样easy使人们感到因特网非常不可靠,那为什么当初不直接把它设计为可靠的? 先打一个例如.邮局寄送的平信非常像无连接的IP数据报.每封平信可能 ...

  10. OpenAuth.net

    基于DDDLite的权限管理OpenAuth.net 1.0版正式发布   距离上一篇OpenAuth.net的文章已经有5个多月了,在这段时间里项目得到了很多朋友的认可,开源中国上面的Star数接近 ...