제출 #1298610

#제출 시각아이디문제언어결과실행 시간메모리
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...