Codeforces 455B A Lot of Games

http://codeforces.com/contest/455/problem/B

题目大意:

给出n个字符串,进行k次游戏,每次游戏输家下次作为先手,游戏规则为每次放一个字母,导致当前构造的字符串是给定的任意一个字符串的前缀,不能操作时为输,赢得第k次比赛的人会取得最终的胜利,问两人都采取最优策略的情况下,谁会赢得比赛。

思路:

00代表无法控制,10代表胜,01代表必败,11代表能赢能输。

如果能赢能输,那么可以一直控制自己前k-1场输,最后赢。

如果先手输,那么一定输

如果只能赢,那么胜负只与场数的奇偶有关、

 

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<iostream>
 6 int ch[100005][26],n,m,sz,f[200005],root,flag;
 7 char s[100005];
 8 int read(){
 9     int t=0,f=1;char ch=getchar();
10     while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
11     while ('0'<=ch&&ch<='9'){t=t*10+ch-'0';ch=getchar();}
12     return t*f;
13 }
14 void insert(){
15     scanf("%s",s+1);
16     int now=root,len=strlen(s+1);
17     for (int i=1;i<=len;i++){
18        if (ch[now][s[i]-'a']==0) ch[now][s[i]-'a']=++sz;
19        now=ch[now][s[i]-'a'];     
20     }
21 }
22 int dfs(int x,int fa){
23     bool pd=0;int ans=0;
24     for (int i=0;i<26;i++)
25      if (ch[x][i]){
26         ans|=dfs(ch[x][i],x)^3;
27         pd=1;
28      } 
29     if (!pd) ans=1;
30     return ans;  
31 }
32 int main(){
33     n=read();m=read();
34     for (int i=1;i<=n;i++){
35         insert();
36     }
37     int tmp=dfs(0,0);
38     if (tmp==3) printf("First");
39     else
40     if (tmp==2){
41         if (m%2==1) printf("First");
42         else printf("Second");
43     }
44     else
45     printf("Second");
46     return 0;
47 }

 

 

 

posted @ 2016-06-30 18:54  GFY  阅读(303)  评论(0编辑  收藏  举报