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

题目大意:

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

思路:

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

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

如果先手输,那么一定输

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

 #include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<iostream>
int ch[][],n,m,sz,f[],root,flag;
char s[];
int read(){
int t=,f=;char ch=getchar();
while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
void insert(){
scanf("%s",s+);
int now=root,len=strlen(s+);
for (int i=;i<=len;i++){
if (ch[now][s[i]-'a']==) ch[now][s[i]-'a']=++sz;
now=ch[now][s[i]-'a'];
}
}
int dfs(int x,int fa){
bool pd=;int ans=;
for (int i=;i<;i++)
if (ch[x][i]){
ans|=dfs(ch[x][i],x)^;
pd=;
}
if (!pd) ans=;
return ans;
}
int main(){
n=read();m=read();
for (int i=;i<=n;i++){
insert();
}
int tmp=dfs(,);
if (tmp==) printf("First");
else
if (tmp==){
if (m%==) printf("First");
else printf("Second");
}
else
printf("Second");
return ;
}

最新文章

  1. 浅谈SQL Server中的三种物理连接操作
  2. 好像越来越觉得 SharePoint &ldquo;难用&rdquo;了
  3. git clone错误
  4. “不是有效WIN32程序”
  5. 解析Visual Studio 2015促进生产力的10个新功能
  6. android 入门-动画与容器
  7. 数论 UVA 11752
  8. 学习iOS的一些网站收藏
  9. mozilla css developer center
  10. 设计模式之Builder模式
  11. ubuntu上部署github博客,利用hexo
  12. 【现代程序设计】【Homework-01】
  13. 分布式搜索Elasticsearch增、删、改、查操作深入详解
  14. oracle系列索引
  15. Javascript设计模式与开发实践读书笔记(1-3章)
  16. C# string数组转int数组(转载)
  17. qt: 系统默认程序打开文件或者软件;
  18. HTML语言
  19. JavaWeb:jsp
  20. linux下面redis安装

热门文章

  1. Linux sar使用
  2. oschina BI商业智能开源软件
  3. 深入 JavaScript(6) - 一静一动
  4. 我学hash_map(1)
  5. jzp线性筛及其简单应用
  6. PE基金的运作模式有哪些?
  7. i&amp;1、负数二进制
  8. OSI七层以及各层上的协议
  9. mysql命令行里的加载更多显示
  10. Lesson2.1:LinkedList、ConcurrentLinkedQueue、LinkedBlockingQueue对比分析