您的位置:首页 > 其它

Codeforces 766D Mahmoud and a Dictionary(并查集+map)

2017-10-02 21:24 281 查看

思路:

对于同义词和反义词分别考虑最一般的形式。

即,对于集合x,y和其相应的反义词的集合x+n,y+n,讨论其关系。

#include <string.h>
#include <iostream>
#include <cstdio>
#include <queue>
#include<algorithm>
#include <map>
using namespace std;
typedef long long int lli;
#define inf 0x3f3f3f3f

const int maxn = 202000;

int nu[maxn];
int find(int x){
return nu[x] = nu[x] == x ? x : find(nu[x]);
}
bool merge(int x,int y){
int xx = find(x),yy = find(y);
if(xx != yy) nu[yy] = xx;
else
return 1;
return 0;
}
char s[200];
map<string,int> ma;

int main(){
for(int i = 1;i <= 200100;i++){
nu[i] = i;
}
int n,m,q;
scanf("%d%d%d",&n,&m,&q);
for(int i = 1;i <= n;i++){
scanf("%s",s);
ma[s] = i;
}
int flag,x,y;
for(int i = 1;i <= m;i++){
scanf("%d%s",&flag,s);
x = ma[s];
scanf("%s",s);
y = ma[s];
int f1,f2,f3,f4;
f1 = find(x);f2 = find(x+n);
f3 = find(y);f4 = find(y+n);

if(flag == 1){
if(f1 == f4 || f2 == f3){
puts("NO");
}
else{
merge(f1,f3);merge(f4,f2);
puts("YES");
}
}
else{
if(f1 == f3 || f4 == f2){
puts("NO");
}
else{
merge(f2,f3);merge(f4,f1);
puts("YES");
}
}
}
for(int i = 1;i <= q;i++){
int t1,t2;
scanf("%s",s);x = ma[s];
t1 = find(ma[s]);
scanf("%s",s);y = ma[s];
t2 = find(ma[s]);
if(t1 == t2){
puts("1");
}
else if(t1 == find(y+n)){
puts("2");
}
else
puts("3");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: