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 题目大 ...
随机推荐
- 【Python-Django】Jinja2模板引擎配置教程详解!!!!
Jinjia2的官方文档:http://jinja.pocoo.org/docs/2.10/ 1. 安装Jinja2扩展包 $ pip install Jinja2 2. 配置Jinja2模板引擎 T ...
- 一道看似简单的go程序的深入分析
先上代码: func main() { var a [10]int for i := 0; i < 10; i++ { go func(i int) { for { a[i]++ } }(i) ...
- maven项目引用错误 和项目结构问题
解决办法: 鼠标右键 maven ---->update prroject Configuration 然后 maven clean maven install
- JS 中获得根目录
/*** * 获得根目录 * @returns */ function getRootPath() { var strFullPath = window.document.location.href; ...
- 7.源码分析---SOFARPC是如何实现故障剔除的?
我在服务端引用那篇文章里面分析到,服务端在引用的时候会去获取服务端可用的服务,并进行心跳,维护一个可用的集合. 所以我们从客户端初始化这部分说起. 服务连接的维护 客户端初始化的时候会调用cluste ...
- pikachu
题目链接:http://127.0.0.1/pikachu-master/vul/sqli/sqli_id.php 题目来源:pikachu-->SQL-inject-->数字型注入(po ...
- 时间格式的字符串在ios中的转换问题
在移动端使用时间选择器的时候,选择了一个时间转换为时间戳,谷歌浏览器以及安卓手机使用 new Date( 选择的时间 ).getTime() 都能够拿到时间戳, 但是在ios手机上会出现出现NAN ...
- openldap介绍和使用
openldap介绍和使用 为什么会有本文? 早期,公司是没有统一认证这个东西的,所以各自玩各自的.于是, confluence一个用户体系,gitlab一个用户体系,Jenkins一个用户体系等等, ...
- Sublime Text 3 使用手册
Ctrl+Shift+P:打开命令面板 Ctrl+P:搜索项目中的文件 Ctrl+G:跳转到第几行 Ctrl+W:关闭当前打开文件 Ctrl+Shift+W:关闭所有打开文件 Ctrl+Shift+V ...
- Java String引起的常量池、String类型传参、“==”、“equals”、“hashCode”问题 细节分析
在学习javase的过程中,总是会遇到关于String的各种细节问题,而这些问题往往会出现在Java攻城狮面试中,今天想写一篇随笔,简单记录下我的一些想法.话不多说,直接进入正题. 1.String常 ...