Codeforces 755B. PolandBall and Game 贪心

时间:2021-10-15 20:28:41

题目大意:

有两个人轮流说单词,已经说过的单词不能再说。给出两人掌握的不同的单词,两人可能掌握相同的单词,但是这个单词也只能说一边。问在两人都是最优策略下先手是否必胜.

题解:

我们发现最优策略一定是先说两人都掌握的单词。
所以我们求出所有同时被掌握的单词
然后根据这种单词的奇偶性来判断即可.

求的时候写了个Trie...
不过好像直接暴力也可以..

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
    x=0;char ch;bool flag = false;
    while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
    while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
inline int cat_max(const int &a,const int &b){return a>b ? a:b;}
inline int cat_min(const int &a,const int &b){return a<b ? a:b;}
const int maxn = 1024;
char s[512];
int nodecnt = 0;
int ch[maxn*256][28];
bool flag[maxn*256];
int root = 0;
void insert(char *s){
    int n = strlen(s+1);
    int nw = root;
    for(int i=1;i<=n;++i){
        if(ch[nw][s[i] - 'a'] == 0) ch[nw][s[i] - 'a'] = ++nodecnt;
        nw = ch[nw][s[i] - 'a'];
    }flag[nw] = true;
}
bool find(char *s){
    int n = strlen(s+1);
    int nw = root;
    for(int i=1;i<=n;++i){
        if(ch[nw][s[i] - 'a'] == 0) return false;
        nw = ch[nw][s[i] - 'a'];
    }return flag[nw];
}
int main(){
    int n,m;read(n);read(m);
    for(int i=1;i<=n;++i){
        scanf("%s",s+1);
        insert(s);
    }
    int com = 0;
    for(int i=1;i<=m;++i){
        scanf("%s",s+1);
        if(find(s)) ++com;
    }n -= com;m -= com;
    if(com&1){
        if(n >= m) puts("YES");
        else puts("NO");
    }else{
        if(n >  m) puts("YES");
        else puts("NO");
    }
    getchar();getchar();
    return 0;
}