Submission #1298610

#TimeUsernameProblemLanguageResultExecution timeMemory
1298610Trn115Love Polygon (BOI18_polygon)C++20
0 / 100
2095 ms572 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...