#include <bits/stdc++.h>
using namespace std;
constexpr int N = 1e5+5;
namespace trie {
struct Node {
int val;
Node *nxt[26];
Node() {
val = 0;
for (int i = 0; i < 26; ++i) nxt[i] = nullptr;
}
} *root = new Node();
int id;
int get(string s) {
Node *cur = root;
for (char c : s) {
int idx = c - 'a';
if (!cur->nxt[idx]) cur->nxt[idx] = new Node();
cur = cur->nxt[idx];
}
if (cur->val) return cur->val;
return cur->val = ++id;
}
}
int n;
int p[N];
bool mark[N];
int dfs(int v) {
mark[v] = true;
int res = 1;
if (!mark[p[v]]) res += dfs(p[v]);
return res;
}
signed main() {
cin.tie(0)->sync_with_stdio(0);
cin >> n;
bool sub3 = true;
for (int i = 1; i <= n; ++i) {
string s, t; cin >> s >> t;
int si = trie::get(s), ti = trie::get(t);
p[si] = ti;
sub3 = sub3 && si == ti;
}
if (n % 2 == 1) {
cout << -1;
return 0;
}
if (sub3) {
cout << n;
return 0;
}
int res = 0;
for (int i = 1; i <= n; ++i) {
if (!mark[i]) {
int val = dfs(i);
if (val == 2) continue;
res += val / 2 + val % 2;
}
}
cout << res;
}
| # | 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... |