Submission #1298625

#TimeUsernameProblemLanguageResultExecution timeMemory
1298625Trn115Love Polygon (BOI18_polygon)C++20
25 / 100
141 ms155952 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...