码迷,mamicode.com
首页 > 其他好文 > 详细

CF766D Mahmoud and a Dictionary

时间:2019-07-04 14:34:33      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:c++   ace   void   turn   key   div   lan   操作   main   

题面:https://www.luogu.org/problemnew/show/CF766D

本题现将字符串转化为两个元素之间的关系,之后再利用带权并查集的操作进行路径压缩和判断即可,注意这里的种类数为2。

Code:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int fa[N],rnk[N];
map<string,int>ma;
void Init(int n)
{
    for(int i=0;i<=n;i++)
    {
        fa[i]=i;
        rnk[i]=0;
    }
}
int Find(int x)
{
    if(x==fa[x])return x;
    int temp=fa[x];
    fa[x]=Find(fa[x]);
    rnk[x]=(rnk[x]+rnk[temp])%2;
    return fa[x];
}
void Merge(int r,int x,int y)
{
    int rx=Find(x);
    int ry=Find(y);
    if(rx==ry)return;
    fa[rx]=ry;
    rnk[rx]=(r+rnk[y]-rnk[x]+2)%2;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,m,q;
    cin>>n>>m>>q;
    Init(n);
    int a;
    string s1,s2;
    for(int i=0;i<n;i++)
    {
        cin>>s1;
        ma[s1]=i;
    }
    while(m--)
    {
        cin>>a>>s1>>s2;
        a--;
        int rs1=Find(ma[s1]);
        int rs2=Find(ma[s2]);
        if(rs1!=rs2)
        {
            Merge(a,ma[s1],ma[s2]);
            cout<<"YES"<<endl;
        }
        else
        {
            if((rnk[ma[s1]]-rnk[ma[s2]]+2)%2!=a)
                cout<<"NO"<<endl;
            else cout<<"YES"<<endl;
        }
    }
    while(q--)
    {
        cin>>s1>>s2;
        int rs1=Find(ma[s1]);
        int rs2=Find(ma[s2]);
        if(rs1!=rs2)cout<<3<<endl;
        else cout<<((rnk[ma[s1]]-rnk[ma[s2]]+2)%2+1)<<endl;
    }
    return 0;
}

CF766D Mahmoud and a Dictionary

标签:c++   ace   void   turn   key   div   lan   操作   main   

原文地址:https://www.cnblogs.com/ukcxrtjr/p/11131961.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!