字符串游戏(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 ...
随机推荐
- IDEA 安装完码云插件,运行报“Cannot run program "xxx":CreateProcess error=2,系统找不到指定的文件”
错误:Cannot run program "E:\Program Files\Git\bin\git.exe":CreateProcess error=2,系统找不到指定的文件 ...
- VS2013修改resource之后产生designer1.cs
1. Unload project2. Edit the csproj file.3. Search for <LastGenOutput>test1.Designer.cs</La ...
- [转]Eclipse快捷键_01_常用快捷键汇总
(注:红色标出来的是经常使用到的快捷键,磨刀不误砍柴工啊...) 一.常用快捷键 Shift+Alt+L: 自动补全等号左边对象 .(用鼠标选中这一行,然后按组合键Shift+Alt+L,在弹出的对 ...
- 热门游戏 2048 C++ 源代码分享
/*By Reason*/ #include<iostream> #include <iomanip> #include<math.h> #include<s ...
- BZOJ5324 JXOI2018 守卫
传送门 这是我见过的为数不多的良心九怜题之一 题目大意 给定一段$n$个点构成的折线,第$i$个折点的坐标是$(i,h_i)$,你可以在$i$点放置一个视野,定义$i$能看到$j$当且仅当$i$处有视 ...
- 2017-2018-1 20179203 《Linux内核原理与分析》第五周作业
攥写人:李鹏举 学号:20179203 ( 原创作品转载请注明出处) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/US ...
- 系列文章--AJAX技术系列总结
各种AJAX方法的使用比较 用ASP.NET写个SQLSERVER的小工具 写自己的ASP.NET MVC框架(下) 写自己的ASP.NET MVC框架(上) 用Asp.net写自己的服务框架 ...
- C/C++面试题总结(2)
C++部分: 1.static(静态)变量有什么作用? 2.virtual关键字用法 3.const有哪些作用 或<王道程序员求职宝典>P95 4.new/delete与malloc/fr ...
- 用遗传算法解决TSP问题
浅谈遗传算法:https://www.cnblogs.com/AKMer/p/9479890.html Description \(小m\)在踏上寻找\(小o\)的路程之后不小心碰到了大魔王\(fat ...
- Poj 3356 ACGT(LCS 或 带备忘的递归)
题意:把一个字符串通过增.删.改三种操作变成另外一个字符串,求最少的操作数. 分析: 可以用LCS求出最大公共子序列,再把两个串中更长的那一串中不是公共子序列的部分删除. 分析可知两个字符串的距离肯定 ...