字符串游戏(strgame)——博弈
题目
【题目描述】
pure 和 dirty 决定玩 $T$ 局游戏。对于每一局游戏,有 $n$ 个字符串,并且每一局游戏由 $K$ 轮组成。具体规则如下:在每一轮游戏中,最开始有一个空串,两者轮流向串的末尾添加一个字符,并且需要保证该串为 $n$ 个字符串中任意一个串的前缀,不能操作的人输掉这一轮,并且在下一轮游戏中由该轮输掉的人先手。另外为了遵循女士优先的原则,在每一局游戏的第一轮均由 pure 先手。
玩家的目标是获得整局游戏的胜利,一局游戏的胜利条件是:对手输掉最后一轮游戏。我们可以假定 pure 和 dirty 都足够聪明。
现在,对于每一局游戏,pure 想知道获胜者是谁。
【输入格式】
第一行一个整数 $T$,表示游戏局数。
接下来 $T$ 组数据,每组数据第一行两个整数 $n,K$,表示字符串数和轮数,接下来$n$行,每行一个字符串。
【输出格式】
对于每一局游戏,输出一行 `Pure` 或者 `Dirty` 表示获胜者。
【样例输入】
2
2 3
a
b
1 2
ab
【样例输出】
Pure
Dirty
【数据范围与提示】
对于 $10\%$ 的数据,字符串总长不超过$5$,且 $K \le 2$ ;
对于 $20\%$ 的数据,字符串总长不超过$5$;
对于另外 $20\%$ 的数据,$K = 1$;
对于 $100\%$ 的数据,$1 \le n \le 10^5; 1 \le K \le 10^9; 1 \le T \le 10$,每局游戏字符串总长不超过 $10^5$,其中字符串非空且均为小写英文字母。
题解
考虑如何博弈最优
如果先手有办法控制自己必胜和必败,那么无论多少轮都能必胜(前面都必败保证先手,最后一轮必胜)
如果只能控制必胜,那么奇数轮的时候都能赢(后手抵消先手)
剩下的则后手必胜
那么把字符串建一棵 tire 树,dp 必胜和必败态即可
代码
其实两个状态是可以压在一起的
#include <bits/stdc++.h>
#define LL long long
#define _(d) while (d(isdigit(ch = getchar())))
using namespace std;
int R() {
int x;
bool f = ;
char ch;
_(!) if (ch == '-') f = ;
x = ch ^ ;
_() x = (x << ) + (x << ) + (ch ^ );
return f ? x : -x;
}
const int N = 2e5 + ;
int n, K, tr[N][], tot, dep[N];
bool f[N], g[N]; // f[x] ±Ø°Ü g[x] ±ØÊ¤
char ch[N];
void insert() {
int x = , len = strlen(ch + );
for (int i = , c; i <= len; i++) {
if (!tr[x][c = ch[i] - 'a'])
tr[x][c] = ++tot;
x = tr[x][c];
}
return;
}
void dfs(int x) {
bool flag = ;
for (int i = , v; i < ; i++)
if (v = tr[x][i])
flag = , dep[v] = dep[x] + , dfs(v);
if (flag) {
if (dep[x] & )
g[x] = ;
else
f[x] = ;
return;
}
if (dep[x] & ) {
g[x] = , f[x] = ;
for (int i = ; i < ; i++) {
if (tr[x][i] && !g[tr[x][i]])
g[x] = ;
if (tr[x][i] && !f[tr[x][i]])
f[x] = ;
}
} else {
for (int i = ; i < ; i++) {
if (tr[x][i] && f[tr[x][i]])
f[x] = ;
if (tr[x][i] && g[tr[x][i]])
g[x] = ;
}
}
return;
}
void clean() {
memset(f, , sizeof f);
memset(g, , sizeof g);
memset(tr, , sizeof tr);
tot = ;
}
int main() {
for (int T = R(); T--;) {
clean(), n = R(), K = R();
for (int i = ; i <= n; i++) scanf("%s", ch + ), insert();
dfs();
if (f[] && g[] || g[] && (K & ))
puts("Pure");
else
puts("Dirty");
}
return ;
}
字符串游戏(strgame)——博弈的更多相关文章
- 20181228 模拟赛 T3 字符串游戏 strGame 博弈论 字符串
3 字符串游戏(strGame.c/cpp/pas) 3.1 题目描述 pure 和 dirty 决定玩 T 局游戏.对于每一局游戏,有n个字符串,并且每一局游戏由K轮组成.具体规则如下:在每一轮 ...
- BZOJ2121 字符串游戏
Description BX正在进行一个字符串游戏,他手上有一个字符串L,以及其 他一些字符串的集合S,然后他可以进行以下操作:对于一个在集合S中的字符串p,如果p在L中出现,BX就可以选择是否将其删 ...
- BZOJ2121: 字符串游戏(DP)(字符串删单词,求最多可以删去多少)
2121: 字符串游戏 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 672 Solved: 376[Submit][Status][Discuss ...
- BZOJ 2121: 字符串游戏 区间DP + 思维
Description BX正在进行一个字符串游戏,他手上有一个字符串L,以及其他一些字符串的集合S,然后他可以进行以下操作:对 于一个在集合S中的字符串p,如果p在L中出现,BX就可以选择是否将其删 ...
- hiho一下 第四十五周 博弈游戏·Nim游戏·二 [ 博弈 ]
传送门 题目1 : 博弈游戏·Nim游戏·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Alice和Bob这一次准备玩一个关于硬币的游戏:N枚硬币排成一列,有的正面 ...
- QuickHit项目(输出字符串游戏)
public class leve { private int leveNo; private int strLength; private int strTimes; private int tim ...
- ACM: NBUT 1107 盒子游戏 - 简单博弈
NBUT 1107 盒子游戏 Time Limit:1000MS Memory Limit:65535KB 64bit IO Format: Practice Appoint ...
- BZOJ 1443 游戏(二分图博弈)
新知识get. 一类博弈问题,基于以下条件: 1.博弈者人数为两人,双方轮流进行决策.2.博弈状态(对应点)可分为两类(状态空间可分为两个集合),对应二分图两边(X集和Y集).任意合法的决策(对应边) ...
- BZOJ3729Gty的游戏——阶梯博弈+巴什博弈+非旋转treap(平衡树动态维护dfs序)
题目描述 某一天gty在与他的妹子玩游戏.妹子提出一个游戏,给定一棵有根树,每个节点有一些石子,每次可以将不多于L的石子移动到父节点,询问将某个节点的子树中的石子移动到这个节点先手是否有必胜策略.gt ...
随机推荐
- Java企业微信开发_06_素材管理之上传本地临时素材文件至微信服务器
一.本节要点 1.临时素材有效期 media_id是可复用的,同一个media_id可用于消息的多次发送(3天内有效) 2.上传文件时的http请求里都有啥 具体原理可参看: 为什么上传文件的表单需要 ...
- Java丨JDK与JRE
小编是以为热爱Java的程序员,可是在我身边的一部分人他们不知道JDK和JRE是什么,有什么区别! 今天小编以个人的理解来说一说,不足之处还望大家指证. 首先我们来看看JDK和JRE他们两个的英文意思 ...
- freeMarker(二)——模板开发指南之入门
学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 模板开发指南-入门 1.模板+数据模型=输出 假设在一个在线商店的应 ...
- BZOJ1113:[POI2008]PLA
浅谈栈:https://www.cnblogs.com/AKMer/p/10278222.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?id ...
- 第四章——Lock的使用
本章主要是讲解:使用Lock对象也能实现同步效果,而且使用起来更方便. 主要掌握两个方面: ReentrantLock类的使用 ReenTrantReadWriteLock类的使用
- (转)python set 用法
转载自:http://hi.baidu.com/����_xu/blog/item/5b9650c513bd3f049d163d8b .html python的set和其他语言类似, 是一个 基本功能 ...
- 问题7:如何实现用户的历史记录功能(最多n条)
实例:制作猜字游戏,添加历史记录功能,显示用户最近猜过的数字 解决方案:使用容量为n的队列存储历史记录 使用标准库colections中的deque,一个双端循环队列 程序退出前,可以使用pickle ...
- 问题4:对dict、list、tuple中的元素排序
一)对字典中元素排序 方法一:利用sorted的key参数进行排序 from random import randint date = {k:randint(0, 20) for k in ran ...
- java基础知识(6)---抽象类与接口
抽象类: abstract抽象:不具体,看不明白.抽象类表象体现.在不断抽取过程中,将共性内容中的方法声明抽取,但是方法不一样,没有抽取,这时抽取到的方法,并不具体,需要被指定关键字abstract所 ...
- C#使用NPOI读取电子表格Excel到DataGridView中
上篇博文中已经介绍了如何写入Excel文件.这篇再介绍一下 如何从Excel中读取数据并保存到DataGridView中. 从Excel中读取数据并保存至DataGridView中,Excel文件第一 ...