#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
#define pb push_back
#define ff first
#define ss second
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    int n, cc = 0; cin>>n;
    if (n % 2){
        cout<<-1<<"\n";
        return 0;
    }
    map<string, int> mp;
    vector<int> f(n + 1);
    for (int i = 1; i <= n; i++){
        string s, t; cin>>s>>t;
        if (mp.find(s) == mp.end()){
            mp[s] = ++cc;
        }
        if (mp.find(t) == mp.end()){
            mp[t] = ++cc;
        }
        f[mp[s]] = mp[t];
    }
    vector<int> g[n + 1];
    vector<bool> ban(n + 1);
    for (int i = 1; i <= n; i++){
        if (f[f[i]] == i){
            if (f[i] != i){
                ban[i] = 1;
            }
            continue;
        }
        g[i].pb(f[i]);
        g[f[i]].pb(i);
    }
    
    vector<bool> used(n + 1);
    vector<int> d[n + 1], all;
    pii t;
    function<void(int, int)> dfs = [&](int v, int pr){
        used[v] = 1; all.pb(v);
        for (int i: g[v]){
            if (i == pr || ban[i]) continue;
            if (used[i]){
                t = {v, i};
                continue;
            }
            d[i].pb(v);
            d[v].pb(i);
            dfs(i, v);
        }
    };
    
    vector<vector<int>> dp(n + 1, vector<int>(2));
    function<void(int, int)> solve = [&](int v, int pr){
        used[v] = 1;
        for (int i: d[v]){
            if (i == pr || ban[i]) continue;
            solve(i, v);
            dp[v][0] += max(dp[i][0], dp[i][1]);
        }
        for (int i: d[v]){
            if (i == pr || ban[i]) continue;
            dp[v][1] = max(dp[v][1], 1 + dp[i][0] + (dp[v][0] - max(dp[i][0], dp[i][1])));
        }
    };
    
    int out = n;
    for (int i = 1; i <= n; i++){
        if (ban[i]){
            out--;
            continue;
        }
        if (used[i]) continue;
        all.clear();
        t = {0, 0};
        dfs(i, 0);
        solve(i, 0);
        int d1 = max(dp[i][0], dp[i][1]);
        
        if (t.ff){
            int d2 = 1;
            for (int j: all) dp[j][0] = dp[j][1] = used[j] = 0;
            used[t.ff] = used[t.ss] = ban[t.ff] = ban[t.ss] = 1;
            for (int j: all){
                if (used[j]) continue;
                solve(j, 0);
                d2 += max(dp[j][0], dp[j][1]);
            }
            ban[t.ff] = ban[t.ss] = 0;
            out -= max(d1, d2);
        }
        else {
            out -= d1;
        }
    }
    
    cout<<out<<"\n";
}
| # | 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... |