题目链接: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)的更多相关文章

  1. 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 ...

  2. Codeforces 455B A Lot of Games(字典树+博弈)

    题目连接: Codeforces 455B A Lot of Games 题目大意:给定n.表示字符串集合. 给定k,表示进行了k次游戏,然后是n个字符串.每局開始.字符串为空串,然后两人轮流在末尾追 ...

  3. Codeforces 455B A Lot of Games 字典树上博弈

    题目链接:点击打开链接 题意: 给定n个字符串,k局游戏 对于每局游戏,2个玩家轮流给一个空串加入一个小写字母使得加完后的字符串不是n个字符串的前缀. 输家下一轮先手 问是先手必胜还是后手必胜 思路: ...

  4. codeforces 456 E. Civilization(并查集+数的直径)

    题目链接:http://codeforces.com/contest/456/problem/E 题意:给出N个点,M条边,组成无环图(树),给出Q个操作,操作有两种: 1 x,输出x所在的联通块的最 ...

  5. Codeforces Round #551 (Div. 2) D. Serval and Rooted Tree (树形dp)

    题目链接 题意:给你一个有根树,假设有k个叶子节点,你可以给每个叶子节点编个号,要求编号不重复且在1-k以内.然后根据节点的max,minmax,minmax,min信息更新节点的值,要求根节点的值最 ...

  6. 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 ...

  7. Codeforces 743D:Chloe and pleasant prizes(树形DP)

    http://codeforces.com/problemset/problem/743/D 题意:求最大两个的不相交子树的点权和,如果没有两个不相交子树,那么输出Impossible. 思路:之前好 ...

  8. codeforces 161D Distance in Tree 树形dp

    题目链接: http://codeforces.com/contest/161/problem/D D. Distance in Tree time limit per test 3 secondsm ...

  9. codeforces 337D Book of Evil (树形dp)

    题目链接:http://codeforces.com/problemset/problem/337/D 参考博客:http://www.cnblogs.com/chanme/p/3265913 题目大 ...

随机推荐

  1. Web容器启动中执行某个Java类

    1.监听(Listener) <!-- 配置监听 --> <listener> <listener-class>com.xian.jdbc.GetPropertie ...

  2. 数据结构之堆栈C++版

    /* 堆栈本身就是一种线性数据结构,说白了他与容器线性表是一种数据类型,不要认为他多高大上. 实时上他还没有线性表复杂,下面简单的实现一下堆栈. 事实上整个核心操作都是在操作指向堆栈的顶部元素的指针 ...

  3. 给面试官讲明白:一致性Hash的原理和实践

    "一致性hash的设计初衷是解决分布式缓存问题,它不仅能起到hash作用,还可以在服务器宕机时,尽量少地迁移数据.因此被广泛用于状态服务的路由功能" 01分布式系统的路由算法 假设 ...

  4. 【转】linux tar.gz zip 解压缩 压缩命令

    http://apps.hi.baidu.com/share/detail/37384818 download ADT link http://dl.google.com/android/ADT-0. ...

  5. 读取某个目录下的所有图片并显示到pictureBox

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  6. PCA(主成分分析)原理,步骤详解以及应用

    主成分分析(PCA, Principal Component Analysis) 一个非监督的机器学习算法 主要用于数据的降维处理 通过降维,可以发现更便于人类理解的特征 其他应用:数据可视化,去噪等 ...

  7. NFS Debian 服务器,CentOS 客户端

    0x00 事件 最近买了一台 500G 储存的 VPS,但是与国内的连接.下载速度都比较差,于是想了个「曲线救国」的方式. 另外有一台 GIA 与 VPS-500G 通信比较理想,同时 GIA 与国内 ...

  8. ThreadLocal中优雅的数据结构如何体现农夫山泉的广告语

    本篇文章主要讲解 ThreadLocal 的用法和内部的数据结构及实现.有时候我们写代码的时候,不太注重类之间的职责划分,经常造出一些上帝类,也就是什么功能都往这个类里放.虽然能实现功能但是并不优雅且 ...

  9. luoguP3588_[POI2015]PUS

    题意 有一个\(n\)个数的序列,已知其中的\(k\)个数,然后有\(m\)个信息,每个信息给出区间\([l,r]\),和\(k\)个数,表示区间\([l,r]\)中这\(k\)个数大于剩下的\(r- ...

  10. Go语言-基本的http请求操作

    Go发起GET请求 基本的GET请求 //基本的GET请求 package main import ( "fmt" "io/ioutil" "net/ ...