所做原题又是黑秋哥的,所以我不贴了。
细数所犯的脑残错误:
1.哈希表就用边名作映射就可以了,不用再开一倍的空间。。。
2.合并时异或值一定要先计算一下!!。。。。
顺便说一句,我没有计算异或值,直接用的合并时的关系进行赋值,样例都没过竟然得了 85 分,天理何在。。。
总结:上次就是错了这里,这次还不记得么。。。。。。。
Code :
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <climits>
#include <iostream>
#include <algorithm>
typedef int TYPE;
typedef long long int64;
typedef unsigned int uint;
typedef unsigned long long uint64;
#define swap(a, b, t) ({t _ = (a); (a) = (b); (b) = _;})
#define MAX(a, b, t) ({t _ = (a), __ = (b); _ > __ ? _ : __;})
#define MIN(a, b, t) ({t _ = (a), __ = (b); _ < __ ? _ : __;})
#define max(a, b) ({TYPE _ = (a), __ = (b); _ > __ ? _ : __;})
#define min(a, b) ({TYPE _ = (a), __ = (b); _ < __ ? _ : __;})
#define maxn 200005
typedef int arr[maxn];
typedef bool brr[maxn];
int n, m, ha, ans, i;
arr hash, next, to;
arr p, q, ufs;
brr b, g;
int find(int u)
{
if (ufs[u] == u) return u;
int ff = ufs[u];
ufs[u] = find(ufs[u]), g[u] ^= g[ff];
return ufs[u];
}
int gethash(int k)
{
int kk = k % maxn;
for (int e = hash[kk]; e; e = next[e])
if (to[e] == k) return e;
next[++ ha] = hash[kk], to[hash[kk] = ha] = k;
return ufs[ha] = ha;
}
void work()
{
for (i = ans = 1; i <= n; ans = ++ i)
{
int h1 = gethash(p[i]), h2 = gethash(q[i]);
int f1 = find(h1), f2 = find(h2);
if (f1 != f2) ufs[f2] = f1, g[f2] = b[i] ^ g[h1] ^ g[h2];
else if (g[h1] ^ g[h2] != b[i]) break;
}
ans == n + 1 ? puts("-1") : printf("%d\n", ans);
}
void init()
{
char s[10] = {0};
scanf("%d%d\n", & n, & m);
for (int i = 1, l, r; i <= n; ++ i)
{
scanf("%d%d%s\n", & l, & r, s), -- l;
p[i] = l, q[i] = r, b[i] = s[0] == 'o';
gethash(l), gethash(r);
}
}
int main()
{
freopen("shame.in", "r", stdin);
freopen("shame.out", "w", stdout);
init();
work();
return 0;
}