字符串游戏 您所在的位置:网站首页 字母的游戏开始 字符串游戏

字符串游戏

#字符串游戏| 来源: 网络整理| 查看: 265

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。

思路 实现:f数组:两人都想赢时是否有必赢策略,g数组:两人都想输时是否有必输策略 先手无必胜策略,则先手在k轮游戏中都是先手,必败; 先手有必胜策略,无必败策略,则每轮游戏双方都会交换先后手,如果进行了奇数轮游戏,则先手必胜,否则先手必败; 先手既有必胜策略也有必败策略,则先手可以在前k-1轮游戏中使用必败策略,在最后一轮使用必胜策略,因此先手必胜。 代码 #include #include #include using namespace std; int n,k,cnt,f[1000005],g[1000005]; char s[100005]; struct fdfdfd{ int ch[27],flag; void init(){memset(ch,0,sizeof(ch)); flag=0;} }e[1000005]; void insert(char a[],int len) { int root=1; for(int i=0;i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有