【Foreign】Game [博弈论][DP]
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]的更多相关文章
- 2018.09.25 poj2068 Nim(博弈论+dp)
传送门 题意简述:m个石子,有两个队每队n个人循环取,每个人每次取石子有数量限制,取最后一块的输,问先手能否获胜. 博弈论+dp. 我们令f[i][j]f[i][j]f[i][j]表示当前第i个人取石 ...
- 【uoj#51】[UR #4]元旦三侠的游戏 博弈论+dp
题目描述 给出 $n$ 和 $m$ ,$m$ 次询问.每次询问给出 $a$ 和 $b$ ,两人轮流选择:将 $a$ 加一或者将 $b$ 加一,但必须保证 $a^b\le n$ ,无法操作者输,问先手是 ...
- 【bzoj4550】小奇的博弈 博弈论+dp
题目描述 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色.最左边是白色棋子,最右边 是黑色棋子,相邻的棋子颜色不同. 小奇可以移动白色棋子,提比可以移动黑色的棋子, ...
- 「模拟赛20181025」御风剑术 博弈论+DP简单优化
题目描述 Yasuo 和Riven对一排\(n\)个假人开始练习.斩杀第\(i\)个假人会得到\(c_i\)个精粹.双方轮流出招,他们在练习中互相学习,所以他们的剑术越来越强.基于对方上一次斩杀的假人 ...
- BZOJ_2017_[Usaco2009 Nov]硬币游戏_博弈论+DP
BZOJ_2017_[Usaco2009 Nov]硬币游戏_博弈论+DP Description 农夫约翰的奶牛喜欢玩硬币游戏,因此他发明了一种称为“Xoinc”的两人硬币游戏. 初始时,一个有N(5 ...
- 【CSA49F】【XSY3317】card 博弈论 DP
题目大意 不会博弈论的 yww 在和博弈论大师 yxq 玩一个游戏. 有 \(n\) 种卡牌,第 \(i\) 种卡牌有 \(b_i\) 张. yww 会先把所有 \(B=\sum_{i=1}^nb_i ...
- 湖南大学第十四届ACM程序设计新生杯(重现赛)I:II play with GG(博弈论||DP)
链接:https://ac.nowcoder.com/acm/contest/338/I 来源:牛客网 题目描述 IG won the S championship and many people a ...
- POJ2068 Nim 博弈论 dp
http://poj.org/problem?id=2068 博弈论的动态规划,依然是根据必胜点和必输点的定义,才明白过来博弈论的dp和sg函数差不多完全是两个概念(前者包含后者),sg函数只是mex ...
- bzoj 2798 [Poi2012]Bidding 博弈论+dp
题目大意 A和B两个人在玩一个游戏,这个游戏是他们轮流操作一对整数(x,y). 初始时(x,y)=(1,0),可以进行三种操作: 将(x,y)变成(1,x+y). 将(x,y)变成(2x,y). 将( ...
随机推荐
- python学习摘要(4)--列表简单处理
列表打印,访问列表元素 alist = [a,b,c,d,e] print(alist) friends_name = ['alex','bill','castle','dale'] c = 1 wh ...
- OSG学习:响应键盘鼠标示例
示例功能:示例里面有两个模型,一个是牛,另一个是飞机.鼠标右键时牛和飞机都隐藏,鼠标左键双击时牛和飞机都显示,按键盘上面的LEFT键,显示牛,按键盘上面的RIGHT键显示飞机.其中显示与隐藏节点使用的 ...
- 3dContactPointAnnotationTool开发日志(六)
一种可行的思路就是枚举一个模型的三角面片,然后判断三角形是否与另一个物体相交即可.为了让效果更好我想只渲染模型的线框. 在网上查了半天好像Unity里都没有自带的方便的渲染线框的方式,我又自己 ...
- matlab的二维卷积操作(转)
MATLAB的conv2函数实现步骤(conv2(A,B)): 其中,矩阵A和B的尺寸分别为ma*na即mb*nb ① 对矩阵A补零,第一行之前和最后一行之后都补mb-1行,第一列之前和最后一列之后都 ...
- (转)Linux NUMA引发的性能问题
最近某客户的核心业务系统又出了翻译缓慢的情况.该问题在6月份也出现过,当时进行了一次调整. 我们首先来看下故障时间段的awr报告: 单纯的从TOP 5 event,基本上是看不出任何东西的,可能有人会 ...
- centos设置时间同步
1.安装ntpdate #yum install ntpdate 2. #cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #ntpdate ...
- SQL SERVER技术内幕之10 可编程对象
一.变量 变量用于临时保存数据值,以供在声明它们的同一批处理语句中引用.例如,以下代码先声明一个数据类型为INT的变量@i,再将它赋值为10; DECLARE @i as INT; SET @i = ...
- div、span绑定内容改变事件
内容改变事件onchange只适用于form表单标签(input.select.textarea) 当需要对div.span标签进行内容改变监听则无法适用,查阅了一些资料发现jquery有针对的方法, ...
- set(gcf,'DoubleBuffer','on')以及sort
设置的目的是为了防止在不断循环画动画的时候会产生闪烁的现象,而这样便不会了.在动画的制作比较常用. Matlab排序函数-sort sort函数的调用格式: sort(X) 功能:返回对向量X中的元素 ...
- BZOJ4700 适者(贪心+cdq分治+斜率优化)
首先考虑怎么安排攻击顺序.显然如果攻击了某台兵器就应该一直连续攻击直到将其破坏,破坏所需时间可以直接算出来,设其为b.假设确定了某个破坏顺序,如果交换相邻两个兵器,显然不会对其他兵器造成影响,两种顺序 ...