2014年11月13日 星期四

Codeforces Round #260 (Div. 1), problem: (B) A Lot of Games

建好字典樹後
要想好有兩種情況:
1. 是否可先手求勝
2. 是否可先手求敗


#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<vector>
#include<utility>
#include<map>
#include<set>
#include<queue>
#include<cmath>
#define nullptr nptr
using namespace std;
typedef long long int int64;
struct _node{ _node* ch[26];};
typedef _node node;
node* nptr;
node* newnode(){
    node* nn = new node();
    for(int lx = 0;lx < 26;lx++)
        nn->ch[lx] = nullptr;
    return nn;
}
node* root;
void addword(char* str, node* rt){
    char ch = str[0];
    if(ch == 0) return;
    if(rt->ch[ch-'a'] == nullptr)
        rt->ch[ch-'a'] = newnode();
    addword(str+1, rt->ch[ch-'a']);
    return;
}
char buf[100011];
int dp(node* rt){
    int cnt[2] = {0};
    for(int lx = 0;lx < 26;lx++)
        if(rt->ch[lx] != nullptr)
            cnt[dp(rt->ch[lx])]++;
    return (cnt[0] > 0);
}
int dp2(node* rt){
    int cnt[2] = {0};
    for(int lx = 0;lx < 26;lx++)
        if(rt->ch[lx] != nullptr)
            cnt[dp2(rt->ch[lx])]++;
    if(cnt[0] + cnt[1] == 0)
        return 1;
    else
        return cnt[0]>0;
}
int main()
{
    root = newnode();
    int n, k;scanf("%d %d", &n, &k);
    for(int lx = 0;lx < n;lx++){
        scanf("%s", buf);
        addword(buf, root);
    }
    int val0 = dp(root); // 先手求勝
    int val1 = dp2(root); // 先手求敗
    //printf("%d %d\n", val0, val1);
    if(val0 == 0)
        puts("Second");
    else
        puts(((k+val1)%2) ? "First":"Second");

    return 0;
}

沒有留言:

張貼留言