Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
34333 | 沈仲恩 | 【S】T2 | C++ | 通过 | 100 | 37 MS | 8772 KB | 1347 | 2024-11-06 08:30:31 |
#include <bits/stdc++.h> #define int long long using namespace std; int fa[100005], sz[100005], a[100005], b[100005], sum; unordered_map<int, int> mp, id; inline int find(int x) { return fa[x] != x ? fa[x] = find(fa[x]) : x; } inline void mg(int x, int y) { x = find(x), y = find(y); if (x == y) return; fa[x] = y, sz[y] += sz[x]; } signed main() { int n; scanf("%lld", &n); for (int i = 1; i <= n; i++) { scanf("%lld", &a[i]); mp[a[i]]++, sum ^= a[i]; } mp[sum]++; for (int i = 1; i <= n; i++) { scanf("%lld", &b[i]); mp[b[i]]--; if (mp[b[i]] < 0) { puts("-1"); return 0; } } int cnt = 0; for (auto p : mp) id[p.first] = ++cnt; for (int i = 1; i <= cnt; i++) fa[i] = i, sz[i] = 1; int ans = n - 1; for (int i = 1; i <= n; i++) { if (a[i] == b[i]) { ans--; continue; } mg(id[a[i]], id[b[i]]); } for (int i = 1; i <= cnt; i++) { // printf("%lld ", sz[i]); if (sz[i] != 1 && find(i) == i) ans++; } // puts(""); ans += (sz[find(id[sum])] == 1 || id[sum] == 0); printf("%lld", ans); return 0; }