CF766D Mahmoud and a Dictionary

Posted ukcxrtjr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF766D Mahmoud and a Dictionary相关的知识,希望对你有一定的参考价值。

题面: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的主要内容,如果未能解决你的问题,请参考以下文章

CF 862C Mahmoud and Ehab and the xor(异或)

CF.862D.Mahmoud and Ehab and the binary string(交互 二分)

[CF959E] Mahmoud and Ehab and the xor-MST - 贪心,最小生成树

Mahmoud and a Dictionary

B. Mahmoud and a Triangle1000 / 数学

Codeforces 862B - Mahmoud and Ehab and the bipartiteness