This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
    #include<bits/stdc++.h>
    using namespace std;
     
    int main(){
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	cout.tie(0);
    	int n;
    	cin>>n;
    	map<string,int>mp;
    	vector<int>cnt(n+1);
    	vector<vector<int>>revadj(n+1);
    	vector<pair<string,string>>all(n);
    	for(int i=0;i<n;i++){
    		cin>>all[i].first>>all[i].second;
    		mp[all[i].first]=i;
    	}
    	vector<int>adj(n+1);
    	for(int i=0;i<n;i++){
    		int x=mp[all[i].second];
    		revadj[x].push_back(i);
    		adj[i]=x;
    		cnt[x]++;
    	}
    	if(n&1){
    		cout<<-1<<"\n";
    		return 0;
    	}
    	int res=n;
    	set<pair<int,int>>st;
    	vector<int>visa(n+1);
    	for(int i=0;i<n;i++){
    		if(adj[i]!=i&&adj[adj[i]]==i){
    			res--;
    			visa[i]=1;
    			continue;
    		}
    		st.insert(make_pair(cnt[i],i));
    	}
    	while((int)st.size()>0){
    		auto x=*st.begin();
    		if(x.first>=1){
    			vector<int>vis(n+2);
    			for(int i=0;i<n;i++){
    				if(st.count(make_pair(cnt[i],i))==0){
    					vis[i]=1;
    				}
    			}
    			for(int i=0;i<n;i++){
    				if(vis[i]==0){
    					int cnta=0;
    					int fi=i;
    					while(vis[fi]==0){
    						vis[fi]=1;
    						cnta++;
    					//	cout<<fi<<" "<<adj[fi]<<'\n';
    						fi=adj[fi];
    					}
    					if(cnta==2){
    						res-=cnta;
    						continue;
    					}
    					//cout<<i<<" "<<cnt<<"\n";
    					res-=(cnta)/2;
    				}
    			}
    			break;
    		}
    		st.erase(x);
    		//cout<<x.second<<" "<<adj[x.second]<<'\n';
    		if(adj[x.second]==x.second||visa[adj[x.second]]){
    			continue;
    		}
    		res--;
    		for(auto y:revadj[x.second]){
    			st.erase(make_pair(cnt[y],y));
    		}
    	//	cout<<x.second<<'\n';
    		st.erase(make_pair(cnt[adj[x.second]],adj[x.second]));
    		if(st.count(make_pair(cnt[adj[adj[x.second]]],adj[adj[x.second]]))==1){
    			st.erase(make_pair(cnt[adj[adj[x.second]]],adj[adj[x.second]]));
    			cnt[adj[adj[x.second]]]--;
    			st.insert(make_pair(cnt[adj[adj[x.second]]],adj[adj[x.second]]));
    		}		
    		for(auto y:revadj[adj[x.second]]){
    			st.erase(make_pair(cnt[y],y));
    		}
    	}
    	cout<<res<<'\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... |