题目

【题目描述】

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)——博弈的更多相关文章

  1. 20181228 模拟赛 T3 字符串游戏 strGame 博弈论 字符串

    3  字符串游戏(strGame.c/cpp/pas) 3.1  题目描述 pure 和 dirty 决定玩 T 局游戏.对于每一局游戏,有n个字符串,并且每一局游戏由K轮组成.具体规则如下:在每一轮 ...

  2. BZOJ2121 字符串游戏

    Description BX正在进行一个字符串游戏,他手上有一个字符串L,以及其 他一些字符串的集合S,然后他可以进行以下操作:对于一个在集合S中的字符串p,如果p在L中出现,BX就可以选择是否将其删 ...

  3. BZOJ2121: 字符串游戏(DP)(字符串删单词,求最多可以删去多少)

    2121: 字符串游戏 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 672  Solved: 376[Submit][Status][Discuss ...

  4. BZOJ 2121: 字符串游戏 区间DP + 思维

    Description BX正在进行一个字符串游戏,他手上有一个字符串L,以及其他一些字符串的集合S,然后他可以进行以下操作:对 于一个在集合S中的字符串p,如果p在L中出现,BX就可以选择是否将其删 ...

  5. hiho一下 第四十五周 博弈游戏·Nim游戏·二 [ 博弈 ]

    传送门 题目1 : 博弈游戏·Nim游戏·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Alice和Bob这一次准备玩一个关于硬币的游戏:N枚硬币排成一列,有的正面 ...

  6. QuickHit项目(输出字符串游戏)

    public class leve { private int leveNo; private int strLength; private int strTimes; private int tim ...

  7. ACM: NBUT 1107 盒子游戏 - 简单博弈

     NBUT 1107  盒子游戏 Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:  Practice  Appoint ...

  8. BZOJ 1443 游戏(二分图博弈)

    新知识get. 一类博弈问题,基于以下条件: 1.博弈者人数为两人,双方轮流进行决策.2.博弈状态(对应点)可分为两类(状态空间可分为两个集合),对应二分图两边(X集和Y集).任意合法的决策(对应边) ...

  9. BZOJ3729Gty的游戏——阶梯博弈+巴什博弈+非旋转treap(平衡树动态维护dfs序)

    题目描述 某一天gty在与他的妹子玩游戏.妹子提出一个游戏,给定一棵有根树,每个节点有一些石子,每次可以将不多于L的石子移动到父节点,询问将某个节点的子树中的石子移动到这个节点先手是否有必胜策略.gt ...

随机推荐

  1. hdu 2018 母牛的故事(简单dp)

    母牛的故事 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  2. cpu满问题分析

    功能问题,通过日志,单步调试相对比较好定位. 性能问题,例如线上服务器CPU100%,如何找到相关服务,如何定位问题代码,更考验技术人的功底. 做为开发人员,肯定会遇到这类问题,介绍一下分析CPU 1 ...

  3. hbase_异常_02_hbase无法访问16010端口

    一.异常现象 上一个异常解决了之后,已经能正常启动hbase了,也能正常使用hbase shell  ,但是无法通过浏览器访问 16010端口. 二.异常原因 1.原因一 hbase 1.0 以后的版 ...

  4. jQuery插件--图片文字向上向左循环滚动

    需要引用jquery 调用非常简单: 一. 向上滚动 $(".scroll_two").jScroll({vertical: true}); <div class=" ...

  5. C++中Segmentation fault(Core Dump)错误处理

    什么是Core Dump? Core的意思是内存, Dump的意思是扔出来, 堆出来. 开发和使用Unix程序时, 有时程序莫名其妙的down了, 却没有任何的提示(有时候会提示core dumped ...

  6. Agc018_B Sports Festival

    传送门 题目大意 有$n$个人,$m$种运动$(n,m\leq 300)$,每个人对$m$种运动有喜爱度的排名. 请你划分一个$m$种运动的非空集合,使得当每个人参加集合内喜爱度排名最高的运动时,最多 ...

  7. 图形化升级单机oracle 11.2.0.4 到 12.2.0.1

    1. 讲补丁包上传到 Oracle server ,解压.安装 [oracle@11g tmp]$ unzip linuxx64_12201_database.zip 2. 检查当前版本 SQL> ...

  8. node-webkit开发基本步骤

    详情请查看:http://www.heiboard.com/?p=2091

  9. Operating System-Thread(4) 线程的调度激活机制(Scheduler Activations)

    本文主要介绍线程的调度激活机制(Scheduler Activations),主要内容: 调度激活机制简介 上行调用(upcall) 中断处理(Interrupt) 一. 调度激活机制简介 上一篇文章 ...

  10. BZOJ2809:[APIO2012]dispatching

    浅谈左偏树:https://www.cnblogs.com/AKMer/p/10246635.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php? ...