题目链接:http://codeforces.com/problemset/problem/766/D
题目大意:给出多个字符串 然后再输入多个字符串之间的关系 让我们判断这其中是否存在矛盾的关系 有矛盾输出NO 没矛盾输出 YES
然后再输入多个询问 每个询问 两个字符串 让我们判断其中的关系 同义词输出1 反义词输出2 不确定输出3

思路:用长度为2n的并查集就可以了。f[a]为a的同义集合。f[a+n]为a的反义集合。

合并的时候处理一下就可以了。

#include <bits/stdc++.h>
using namespace std;

map<string, int> mp;
int fa[200005];

int fd(int u){
    if(fa[u]==u){
        return u;
    }
    else{
        return fa[u]=fd(fa[u]);
    }
}

int main(){

    int n, m, k, cut=1;
    scanf("%d%d%d", &n, &m, &k);
    string a;
    for(int i=1; i<=n; i++){
        cin>>a;
        mp[a]=cut++;
        fa[i]=i;
        fa[i+n]=i+n;
    }
    for(int i=1; i<=m; i++){
        int op, ta, tb, ba, bb;
        string a, b;
        cin>>op>>a>>b;
        ta=fd(mp[a]);
        tb=fd(mp[b]);
        ba=fd(mp[a]+n);
        bb=fd(mp[b]+n);
        if(op==1&&(ta==bb||tb==ba)||op==2&&(ta==tb)){
            printf("NO\n");
        }
        else{
            printf("YES\n");
            if(op==1){
                fa[ta]=tb;
                fa[ba]=bb;
            }
            else{
                fa[ta]=bb;
                fa[ba]=tb;
            }
        }
    }
    for(int i=1; i<=k; i++){
        string a, b;
        cin>>a>>b;
        int a_=mp[a], b_=mp[b];
        int ta=fd(a_), tb=fd(b_);
        int ba=fd(a_+n), bb=fd(b_+n);
        if(ta==tb){
            printf("1\n");
        }
        else if(ta==bb){
            printf("2\n");
        }
        else{
            printf("3\n");
        }
    }

    return 0;
}