字符串游戏(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 ...
随机推荐
- 为什么jdk1.8不支持sql.append,该如何解决
StringBuilder sql = new StringBuilder("SELECT ID,COMMAND,DESCRIPTION,CONTENT FROM message where ...
- django学习笔记(二)模板
1.当模板中的变量名遇到点时,以下面的顺序查找(短路逻辑): (1)字典类型查找: >>> from django.template import Template, Context ...
- 【JVM】java方法区
java方法区[名词解析] --->和java堆一样,方法区是一块所有线程共享的内存区域. --->保存系统的类信息,比如,类的字段,方法,常量池等. ...
- bzoj 3916: friends 瞎搞
题目: 有三个好朋友喜欢在一起玩游戏,A君写下一个字符串S,B君将其复制一遍得到T,C君在T的任意位置(包括首尾)插入一个字符得到U.现在你得到了U,请你找出S. 题解: 发现字符串的长度一定为奇数. ...
- 白话算法(6) 散列表(Hash Table) 从理论到实用(下)
[澈丹,我想要个钻戒.][小北,等等吧,等我再修行两年,你把我烧了,舍利子比钻戒值钱.] ——自扯自蛋 无论开发一个程序还是谈一场恋爱,都差不多要经历这么4个阶段: 1)从零开始.没有束缚的轻松感.似 ...
- 实用的原生js图片轮播
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 通过设置swift中container的ACL提供匿名访问及用户授权读取服务
在上层使用swift提供的云存储服务的过程中,提出了无需验证的使用需求. 在参考了:http://my.oschina.net/alanlqc/blog/160196(curl命令操作) 官方文档: ...
- CRT Library Features
CRT Library Features The new home for Visual Studio documentation is Visual Studio 2017 Documentatio ...
- SpringMvc之参数绑定注解详解之四
简介: @RequestBody 作用: i) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对 ...
- UpdatePanel无刷新
使用UpdatePanel实现无刷新效果 1. <asp:ScriptManager ID="scriptManger1" ruant="server"& ...