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 }