字符串游戏(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 ...
随机推荐
- node.js redis对事务的控制
redis对事务的支持还是比较差的,就是把所有的执行命令方到队列中一个一个执行 multi开启一个事务,exec执行事务集合中的命令 代码: var redisClient; redisClient. ...
- linux命令学习笔记(6):rmdir 命令
今天学习一下linux中命令: rmdir命令.rmdir是常用的命令,该命令的功能是删除空目录,一个目录 被删除之前必须是空的.(注意,rm - r dir命令可代替rmdir,但是有很大危险性.) ...
- IP通信中音频编解码技术与抗丢包技术概要
此文较长,建议收藏起来看. 一.一个典型的IP通信模型 二.Server2Server技术分类 Server2Server这块也是一个专门的领域,这里只简单分个类. 1.同一国家相同运营商之间: 同一 ...
- loj515贪心只能过样例
bitset练习题... 位运算真的是玄学... 一开始真的“只能过样例” 后来发现把左移写成了小于号 鬼知道我在想什么/手动微笑 loj第一题 #include<iostream> #i ...
- 【Tensorflow】Ubuntu 安装 Tensorflow gpu
安装环境:Ubuntu 16.04lts 64位,gcc5.4 1.安装Cuda 1. 下载cuda toolkit. 下载cuda8.0 地址:https://developer.nvidia.co ...
- MySQL on Azure高可用性设计 DRBD - Corosync - Pacemaker - CRM (一)
MySQL迁移到Azure上后,由于云的特性,在自建数据中心的MySQL的HA的方法在云上很多都不能部署. 这主要是因为,目前Public Cloud不支持:1. 共享存储:2. Multicast: ...
- java内存模型(netty权威指南)
1.Java内存模型 Java虚拟机规范中试图定义一种java内存模型(java Memory Model,jmm)来屏蔽掉各种操作系统.虚拟机实现厂商和硬件的内存访问差异,以确保Java程序在所有操 ...
- 如何更新node和npm版本
更新npm ---> npm undate -g 更新node ---> npm install -g -n n latest
- window下rails4.1 发生TZInfo::DataSourceNotFound 错误 - smallbottle
在官网上学习rails 4.1 ,启动rails server之后发生了如下错误 $ rails server Booting WEBrick Rails 4.1.0 application star ...
- css 雪碧图
CSS Sprites在国内很多人叫css精灵,是一种网页图片应用处理方式.它允许你将一个页面涉及到的所有零星图片都包含到一张大图中去,这样一来,当访问 该页面时,载入的图片就不会像以前那样一幅一幅地 ...