Game

Time Limit: 20 Sec  Memory Limit: 512 MB

Description

  从前有个游戏。游戏分为 k 轮。

  给定一个由小写英文字母组成的字符串的集合 S,

  在每轮游戏开始时,双方会得到一个空的字符串,

  然后两人轮流在该串的末尾添加字符,并且需要保证新的字符串是 S 中某个串的前缀,直到有一方不能操作,则不能操作的一方输掉这一轮。

  新的一轮由上一轮输的人先手,最后一轮赢的人获得游戏胜利。

  假定双方都采取最优策略,求第一轮先手的一方能否获胜。

Input

  输入包含多组数据。

  每组数据的第一行包含两个整数 n,k,分别表示字符串的数量和游戏的轮数。

  接下来 n 行,每行一个由小写英文字母组成的字符串。

Output

  对于每组数据输出一行,若先手能获胜输出 HY wins!,否则输出 Teacher wins!

Sample Input

  2 3
  a
  b
  3 1
  a
  b
  c

Sample Output

  HY wins!
  HY wins!

HINT

  1 ≤ n ≤ 1e5,1 ≤ k ≤ 1e9,保证所有字符串长度不超过 1e5,数据组数不超过 10。

Solution

  

  显然Trie上这个DP显然就是为了求:一轮中,先手是否必胜或者必败。显然,一个点如果可以走向必败点那么就可以必胜

Code

 #include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
typedef long long s64;
typedef unsigned int u32; const int ONE = 1e6 + ; int n, k;
char s[ONE];
int next[ONE][], total, root = ;
int f[ONE], g[ONE]; int get()
{
int res=,Q=;char c;
while( (c=getchar())< || c> )
if(c=='-')Q=-;
res=c-;
while( (c=getchar())>= && c<= )
res=res*+c-;
return res*Q;
} void Insert()
{
scanf("%s", s + );
int u = root, n = strlen(s + );
for(int i = ; i <= n; i++)
{
int c = s[i] - 'a' + ;
if(!next[u][c]) next[u][c] = ++total;
u = next[u][c];
}
} void Dfs_f(int u)
{
if(!u) return;
int PD = ;
for(int c = ; c <= ; c++) if(next[u][c]) {PD = ; break;}
if(PD) {g[u] = ; return;} PD = ;
for(int c = ; c <= ; c++)
{
Dfs_f(next[u][c]);
if(next[u][c] && f[next[u][c]] == ) PD = ;
}
f[u] = PD;
} void Dfs_g(int u)
{
if(!u) return;
int PD = ;
for(int c = ; c <= ; c++) if(next[u][c]) {PD = ; break;}
if(PD) {g[u] = ; return;} PD = ;
for(int c = ; c <= ; c++)
{
Dfs_g(next[u][c]);
if(next[u][c] && g[next[u][c]] == ) PD = ;
}
g[u] = PD;
} int main()
{
while(scanf("%d %d", &n, &k) != EOF)
{
memset(f, , sizeof(f));
memset(g, , sizeof(g));
memset(next, , sizeof(next));
total = ;
for(int i = ; i <= n; i++)
Insert();
Dfs_f(); Dfs_g();
if(f[] == && g[] == ) printf("HY wins!\n");
else
if(f[] == )
k % == ? printf("HY wins!\n") : printf("Teacher wins!\n");
else
printf("Teacher wins!\n");
}
}

【Foreign】Game [博弈论][DP]的更多相关文章

  1. 2018.09.25 poj2068 Nim(博弈论+dp)

    传送门 题意简述:m个石子,有两个队每队n个人循环取,每个人每次取石子有数量限制,取最后一块的输,问先手能否获胜. 博弈论+dp. 我们令f[i][j]f[i][j]f[i][j]表示当前第i个人取石 ...

  2. 【uoj#51】[UR #4]元旦三侠的游戏 博弈论+dp

    题目描述 给出 $n$ 和 $m$ ,$m$ 次询问.每次询问给出 $a$ 和 $b$ ,两人轮流选择:将 $a$ 加一或者将 $b$ 加一,但必须保证 $a^b\le n$ ,无法操作者输,问先手是 ...

  3. 【bzoj4550】小奇的博弈 博弈论+dp

    题目描述 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色.最左边是白色棋子,最右边 是黑色棋子,相邻的棋子颜色不同.   小奇可以移动白色棋子,提比可以移动黑色的棋子, ...

  4. 「模拟赛20181025」御风剑术 博弈论+DP简单优化

    题目描述 Yasuo 和Riven对一排\(n\)个假人开始练习.斩杀第\(i\)个假人会得到\(c_i\)个精粹.双方轮流出招,他们在练习中互相学习,所以他们的剑术越来越强.基于对方上一次斩杀的假人 ...

  5. BZOJ_2017_[Usaco2009 Nov]硬币游戏_博弈论+DP

    BZOJ_2017_[Usaco2009 Nov]硬币游戏_博弈论+DP Description 农夫约翰的奶牛喜欢玩硬币游戏,因此他发明了一种称为“Xoinc”的两人硬币游戏. 初始时,一个有N(5 ...

  6. 【CSA49F】【XSY3317】card 博弈论 DP

    题目大意 不会博弈论的 yww 在和博弈论大师 yxq 玩一个游戏. 有 \(n\) 种卡牌,第 \(i\) 种卡牌有 \(b_i\) 张. yww 会先把所有 \(B=\sum_{i=1}^nb_i ...

  7. 湖南大学第十四届ACM程序设计新生杯(重现赛)I:II play with GG(博弈论||DP)

    链接:https://ac.nowcoder.com/acm/contest/338/I 来源:牛客网 题目描述 IG won the S championship and many people a ...

  8. POJ2068 Nim 博弈论 dp

    http://poj.org/problem?id=2068 博弈论的动态规划,依然是根据必胜点和必输点的定义,才明白过来博弈论的dp和sg函数差不多完全是两个概念(前者包含后者),sg函数只是mex ...

  9. bzoj 2798 [Poi2012]Bidding 博弈论+dp

    题目大意 A和B两个人在玩一个游戏,这个游戏是他们轮流操作一对整数(x,y). 初始时(x,y)=(1,0),可以进行三种操作: 将(x,y)变成(1,x+y). 将(x,y)变成(2x,y). 将( ...

随机推荐

  1. mysql 只返回一条数据

    问题描述: 需要得到时间最近的一条记录,但是按照时间字段排完序之后,得到的是全部. 解决办法: order by createtime desc //降序:asc:升序 LIMIT 1

  2. 软件工程课堂作业(十一)——NABC分析

    一.团队开发项目:基于Android的重力感应的解锁APP 二.项目特点:区别于一般解锁软件用开机按钮开锁解锁,我们的重力解锁软件根据动作实现解锁,减少了开机按钮的使用频率,提高寿命. 三.NABC分 ...

  3. iOS-Masonry用法

    __weak typeof(self) weakSelf = self; UIView * tempView = [[UIView alloc]init]; NSInteger count = ;// ...

  4. 在Centos中,大容量,且读写频繁的目录

    1./根目录 2./usr目录 3./home目录 4./var目录 5./Swap目录     比较特殊,只要物理内存没使用完,就不会被启用 以上为鸟哥的linuxPDF中的学习心得

  5. phpcms黄页,不能选择行业。解决办法

    用phpcms黄页模块,发布产品的时候.不能选择 产品分类,点开之后,啥都没有,是空的. 这个是因为:js的问题. 解决办法:将 网站根目录的 js 文件中的两个文件,更换为 官方的两个js文件.即可 ...

  6. 关闭或者开启apache的目录浏览

    为了安全或者方便需要关闭或者开启apache的目录浏览   关闭目录浏览    修改http.conf 文件    Options Indexes FollowSymLinks     改为      ...

  7. 【Asp.Net】IIS应用程序池添加ASP.NET v4.0

    可能在安装.NET Framewrok 4.0之前,IIS就已经装好了,结果在IIS的应用程序池中只有.NET 2.0的Classic .NET AppPool和DefaultAppPool.在使用v ...

  8. GSL介绍【转】

    GSL(GNU Scientific Library)是一个C写成的用于科学计算的库,下面是一些相关的包 http://www.thebigdata.cn/JiShuBoKe/5612.html

  9. Android APP性能优化(最新总结)

    导语   安卓大军浩浩荡荡,发展已近十个年头,技术优化日异月新,如今Android 8.0 Oreo 都发布了,Android系统性能已经非常流畅了.但是,到了各大厂商手里,改源码自定系统,使得And ...

  10. BZOJ4589:Hard Nim——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4589 Claris和NanoApe在玩石子游戏,他们有n堆石子,规则如下: 1. Claris和N ...