#include <bits/stdc++.h>
using namespace std;
constexpr int N = 25;
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];
int res, cur;
bool mark[N];
int gen[N];
void backtrack(int i) {
if (i == n + 1) {
res = min(res, cur);
} else if (mark[i]) {
backtrack(i + 1);
} else {
for (int j = i + 1; j <= n; ++j) {
if (!mark[j]) {
mark[j] = true;
gen[i] = j;
gen[j] = i;
cur += gen[i] != p[i];
cur += gen[j] != p[j];
if (cur < res) backtrack(i + 1);
cur -= gen[i] != p[i];
cur -= gen[j] != p[j];
mark[j] = false;
}
}
}
}
signed main() {
cin.tie(0)->sync_with_stdio(0);
cin >> n;
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;
}
if (n % 2 == 1) {
cout << -1;
return 0;
}
res = n;
backtrack(1);
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... |