#include <bits/stdc++.h>
#define int long long
using namespace std;
constexpr int N = 1e5+5;
int n, id;
map<string, int> m;
int p[N];
set<int> rev[N];
int iso;
bool deleted[N];
int progress = 0, res = 0;
vector<int> stk;
set<int> nm;
// Normal
// Single
// Isolated
// True-Deleted
void solve() {
for (int i = 1; i <= n; ++i) {
if (!deleted[i]) {
if (p[p[i]] == i && p[i] != i) {
deleted[i] = true;
deleted[p[i]] = true;
} else if (rev[i].empty()) {
stk.push_back(i);
} else {
nm.insert(i);
}
}
}
while (!stk.empty() || !nm.empty()) {
int v;
if (!stk.empty()) {
v = stk.back(); stk.pop_back();
} else {
v = *nm.begin(); nm.erase(nm.begin());
}
int u = p[v];
if (u == v || deleted[u]) {
++iso;
} else {
nm.erase(u);
deleted[v] = true;
deleted[u] = true;
++res;
}
}
res += iso;
cout << res;
}
signed main() {
cin.tie(0)->sync_with_stdio(0);
cin >> n;
for (int i = 1; i <= n; ++i) {
string s, t; cin >> s >> t;
if (m.find(s) == m.end()) m[s] = ++id;
if (m.find(t) == m.end()) m[t] = ++id;
int si = m[s], ti = m[t];
p[si] = ti;
rev[ti].insert(si);
}
if (n % 2 == 1) {
cout << -1;
return 0;
}
solve();
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |