Codeforces Round #396 (Div. 2) D. Mahmoud and a Dictionary 并查集

D. Mahmoud and a Dictionary

链接:

http://codeforces.com/contest/766/problem/D

代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cstdlib>
 4 #include<cmath>
 5 #include<iostream>
 6 #include<algorithm>
 7 #include<map>
 8 using namespace std;
 9 const int MAXN = 100005;
10 map<string, int>mp;
11 int getId(string str)
12 {
13     if (!mp[str])mp[str] = (int)mp.size();
14     return mp[str];
15 }
16 int fa[MAXN], w[MAXN];
17 void Init(int n)
18 {
19     for (int i = 1; i <= n; i++)
20         fa[i] = i, w[i] = 0;
21 }
22 int Find(int x)
23 {
24     if (x != fa[x])
25     {
26         int rt = Find(fa[x]);
27         w[x] ^= w[fa[x]];
28         fa[x] = rt;
29     }
30     return fa[x];
31 }
32 int Union(int x, int y, int v)
33 {
34     int rx = Find(x), ry = Find(y);
35     if (rx == ry)return -(w[x] ^ w[y] ^ v);
36     fa[rx] = ry, w[rx] = w[x] ^ w[y] ^ v;
37     return 1;
38 }
39 int main()
40 {
41     int n, m, q;
42     scanf("%d%d%d", &n, &m, &q);
43     for (int i = 1; i <= n; i++)
44     {
45         char s[25];
46         scanf("%s", s);
47         getId(s);
48     }
49     Init(n);
50     for (int i = 1; i <= m; i++)
51     {
52         int r;
53         char s[25], t[25];
54         scanf("%d%s%s", &r, s, t);
55         int tmp = Union(getId(s), getId(t), r - 1);
56         printf("%s\n", (tmp<0 ? "NO" : "YES"));
57     }
58     for (int i = 1; i <= q; i++)
59     {
60         char s[25], t[25];
61         scanf("%s%s", s, t);
62         int x = getId(s), y = getId(t);
63         int rx = Find(x), ry = Find(y);
64         printf("%d\n", (rx == ry ? (w[x] ^ w[y] ? 2 : 1) : 3));
65     }
66     return 0;
67 }

 

posted @ 2017-02-13 12:17  Flowersea  阅读(199)  评论(0编辑  收藏  举报