codeforces 456 D. A Lot of Games(字典数+博弈+思维+树形dp)
题目链接:http://codeforces.com/contest/456/problem/D
题意:给n个字符串。进行k次游戏。每局开始,字符串为空串,然后两人轮流在末尾追加字符,保证新的字符串为集合中某字符串的前缀,不能操作者输,新一轮由上一句输的人先手。
题解:先确定一下状态,如果是先手必定赢得话那么就喝k的奇偶性有关系。如果后手必赢那么肯定是后手赢。如果是先手决定输赢的话,那么只要先手的一开始一直让后手赢最后赢一把就行先手必胜,如果是后手决定输赢的话那么显然同理后手必胜。
那么在说一下这题的处理方法显然用字典数比较好处理。然后就是如何判断先手必胜,很明显只要是每一个分支都是奇数个点的话肯定是先手必胜,如果每一个分支都是偶数的话,那么显然后手必胜,如果既有奇数条又有偶数条那么就要判断以当前分支点为起点的必胜态再递推上去。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int M = 1e5 + 10;
struct TnT {
TnT *next[27];
int vis;
TnT():vis(0) {memset(next , 0 , sizeof(next));}
};
void build(TnT *root , char s[]) {
int len = strlen(s);
TnT *p = root;
for(int i = 0 ; i < len ; i++) {
int id = s[i] - 'a';
if(p->next[id] == NULL) {
p->next[id] = new TnT();
}
p = p->next[id];
p->vis++;
}
}
void de(TnT *root) {
if(root == NULL) return ;
for(int i = 0 ; i < 26 ; i++) de(root->next[i]);
delete root;
}
void find(TnT *root , int &x , int &y) {
TnT *p = root;
x = 0 , y = 0;
//x=1表示先手必胜,y=1表示后手必胜x=1&&y=1表示先手决定胜负,x=0&&y=0表示后手决定状态,具体画一下图就知道了。
int u , v;
bool flag = true;
for(int i = 0 ; i < 26 ; i++) {
if(p->next[i]) {
flag = false;
find(root->next[i] , u , v);
if(!u) x = 1;
if(!v) y = 1;
//奇偶变化一次x,y就取反,当然如果当前点是分支点的话那么他最终的胜负状态就要结合所有分支节点的状态。
}
}
if(flag) x = 0 , y = 1;
}
char s[M];
int main() {
int n , m;
scanf("%d%d" , &n , &m);
TnT *root = new TnT();
for(int i = 0 ; i < n ; i++) {
scanf("%s" , s);
build(root , s);
}
int x , y;
find(root , x , y);
de(root);
if(x && y) puts("First");
else if((m & 1) && x) puts("First");
else puts("Second");
return 0;
}
codeforces 456 D. A Lot of Games(字典数+博弈+思维+树形dp)的更多相关文章
- Codeforces Round #343 (Div. 2) E. Famil Door and Roads lca 树形dp
E. Famil Door and Roads 题目连接: http://www.codeforces.com/contest/629/problem/E Description Famil Door ...
- Codeforces 455B A Lot of Games(字典树+博弈)
题目连接: Codeforces 455B A Lot of Games 题目大意:给定n.表示字符串集合. 给定k,表示进行了k次游戏,然后是n个字符串.每局開始.字符串为空串,然后两人轮流在末尾追 ...
- Codeforces 455B A Lot of Games 字典树上博弈
题目链接:点击打开链接 题意: 给定n个字符串,k局游戏 对于每局游戏,2个玩家轮流给一个空串加入一个小写字母使得加完后的字符串不是n个字符串的前缀. 输家下一轮先手 问是先手必胜还是后手必胜 思路: ...
- codeforces 456 E. Civilization(并查集+数的直径)
题目链接:http://codeforces.com/contest/456/problem/E 题意:给出N个点,M条边,组成无环图(树),给出Q个操作,操作有两种: 1 x,输出x所在的联通块的最 ...
- Codeforces Round #551 (Div. 2) D. Serval and Rooted Tree (树形dp)
题目链接 题意:给你一个有根树,假设有k个叶子节点,你可以给每个叶子节点编个号,要求编号不重复且在1-k以内.然后根据节点的max,minmax,minmax,min信息更新节点的值,要求根节点的值最 ...
- Codeforces Round #384 (Div. 2)D - Chloe and pleasant prizes 树形dp
D - Chloe and pleasant prizes 链接 http://codeforces.com/contest/743/problem/D 题面 Generous sponsors of ...
- Codeforces 743D:Chloe and pleasant prizes(树形DP)
http://codeforces.com/problemset/problem/743/D 题意:求最大两个的不相交子树的点权和,如果没有两个不相交子树,那么输出Impossible. 思路:之前好 ...
- codeforces 161D Distance in Tree 树形dp
题目链接: http://codeforces.com/contest/161/problem/D D. Distance in Tree time limit per test 3 secondsm ...
- codeforces 337D Book of Evil (树形dp)
题目链接:http://codeforces.com/problemset/problem/337/D 参考博客:http://www.cnblogs.com/chanme/p/3265913 题目大 ...
随机推荐
- 【iOS】Your account already has a valid ios
打包内测的时候遇到了这个问题,如图所示: 官网解决办法: If the certificate already exists in Member Center, a “Your account alr ...
- Is it a full physical image???
My friend asked me why she could not find some important files in a physical image acquired from an ...
- 用 PYQT5 和 QT Dseingner 写的串口助手
最近公司做项目需要写串口助手,于是从网上找教程着手写了一下,基本的功能可以实现了,但是想要一个表盘的功能一直没有找到教程,有些遗憾.大神们会的话给指导指导 谢谢啦 ! 下边有源码的连接,欢迎大家下载 ...
- Selenium+java - 截图操作
写在前面 自动化测试过程中,运行失败截图可以很好的帮我们定位问题,因此,截图操作也是我们自动化测试中的一个重要环节. 截图方法 1.通过截图类TakeScreenshout实现截图 特点:截取浏览器窗 ...
- FutrueTask原理及源码分析
1.前言 相信很多人了解到FutureTask是因为ThreadPoolExecutor.submit方法,根据ThreadPoolExecutor.submit的使用,我们可以先猜一下FutureT ...
- 关于Linux安装的Python和miniconda
///注意 开头全部是小写建议自己手敲代码不要拷贝 1. Linux下软件的安装: a) Yum 安装(工具) rpm的增强版 b) Rpm安装 c) 源码编译安装:python3(LAMP) d) ...
- docker配置国内镜像地址
docker的官方镜像站被大天朝强了,今天发现阿里有镜像加速这个功能,目前好像是在公测中,废话不多说,接下来告诉你怎么操作. 点击进入阿里镜像库 https://cr.console.aliyun.c ...
- 使用ArrayPool池化大型数组(翻译)
原文链接:https://adamsitnik.com/Array-Pool/ 使用ArrayPool 简介 .NET的垃圾收集器(GC)实现了许多性能优化,其中之一就是,设定年轻的对象很快消亡,然而 ...
- TP5使用API时不可预知的内部异常
最常见的错误形式例如 controller不存在或者 action不存在之类的 我们第一时间想到的 就是 使用 try{}catch(){} 来捕获 例如: /** * show方法在common里定 ...
- 使用re.split 按标点+空格的一种分割办法
import re import string t1 = re.split("["+string.punctuation+" ]","(555) 12 ...