[杂题]:staGame(博弈论+Trie树+DFS)
题目描述
$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\leqslant 2$;
对于$20\%$的数据,字符串总长不超过$5$;
对于另外$20\%$的数据,$K=1$;
对于$100\%$的数据,$1\leqslant n\le 10^5;1\leqslant K\leqslant 10^9; 1\leqslant T\leqslant 10$,每局游戏字符串总长不超过$10^5$,其中字符串非空且均为小写英文字母。
题解
这也许是我写的第一篇有关博弈论的题解。
我们先将所有的串建在$Trie$树上,那么如果你选了某个叶子节点,那么你就赢了;否则你就输了。
也就是在$Trie$树上跑一个$DFS$即可求出答案。
听起来是不是很简单?
时间复杂度:$\Theta(\sum S)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
int n,K;
char ch[100001];
int trie[100001][30],cnt;
int ans[100001];
void pre_work()
{
cnt=1;
memset(trie,0,sizeof(trie));
memset(ans,0,sizeof(ans));
}
void insert(char *str)
{
int len=strlen(ch+1),p=1;
for(int i=1;i<=len;i++)
{
int c=str[i]-'a'+1;
if(!trie[p][c])trie[p][c]=++cnt;
p=trie[p][c];
}
}
void dfs(int x)
{
bool flag=0;
for(int i=1;i<=26;i++)
if(trie[x][i])
{
dfs(trie[x][i]);
flag=1;
ans[x]|=(ans[trie[x][i]]^3);
}
if(!flag)ans[x]=1;
}
int main()
{
int T;scanf("%d",&T);
while(T--)
{
pre_work();
scanf("%d%d",&n,&K);
for(int i=1;i<=n;i++)
{
scanf("%s",ch+1);
insert(ch);
}
dfs(1);
if(ans[1]==3||(ans[1]==2&&(K&1)))puts("Pure");
else puts("Dirty");
}
return 0;
}
rp++
[杂题]:staGame(博弈论+Trie树+DFS)的更多相关文章
- Trie树 + DFS - CSU 1457 Boggle
Boggle Problem's Link: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1457 Mean: 给定n个串,有m个询问. 每个询问 ...
- 2018.10.20 NOIP模拟 巧克力(trie树+dfs序+树状数组)
传送门 好题啊. 考虑前面的32分,直接维护后缀trietrietrie树就行了. 如果#号不在字符串首? 只需要维护第一个#前面的字符串和最后一个#后面的字符串. 分开用两棵trie树并且维护第一棵 ...
- SPOJ11414 COT3 博弈论 + Trie树合并
考虑对于每个子树从下往上依次考虑 对于叶子节点而言,如果可以染色,那么其\(sg\)值为\(1\),否则为\(0\) 考虑往上合并 如果选择了\(x\),那么后继状态就是其所有子树 如果选了其他子树中 ...
- [CSP-S模拟测试]:big(Trie树+贪心)
题目描述 你需要在$[0,2^n)$中选一个整数$x$,接着把$x$依次异或$m$个整数$a_1~a_m$.在你选出$x$后,你的对手需要选择恰好一个时刻(刚选完数时.异或一些数后或是最后),将$x$ ...
- UVa11732 "strcmp()" Anyone?(Trie树+孩子兄弟表示法)
我的做法是先建字典树,统计每个结点出现次数和相同字符串个数,每个结点对答案的贡献就是2*C(次数,2),然后再分别讨论相同字符串和不同字符串对答案的贡献. 另外这题主要就是Trie树的孩子兄弟表示法: ...
- BZOJ 3439 Kpm的MCpassword Trie树+可持久化线段树
题目大意:给定n个字符串,对于每一个字符串求以这个字符串为后缀的字符串中第k小的编号 首先将字符串反转 那么就变成了对于每一个字符串求以这个字符串为前缀的字符串中第k小的编号 然后考虑对字符串排序 那 ...
- cogs 647. [Youdao2010] 有道搜索框 Trie树 字典树
647. [Youdao2010] 有道搜索框 ★☆ 输入文件:youdao.in 输出文件:youdao.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 在有 ...
- trie树——【吴传之火烧连营】
突然发现好像没有讲过一种叫做tire树的神奇东西. 问题描述: 题目描述 [题目背景] 蜀汉章武元年(221年),刘备为报吴夺荆州.关羽被杀之仇,率大军攻吴.吴将陆逊为避其锋,坚守不战,双方成对峙之势 ...
- poj3764(dfs+Trie树+贪心)
题目链接:http://poj.org/problem?id=3764 分析:好题!武森09年的论文中有道题CowXor,求的是线性结构上的,连续序列的异或最大值,用的办法是先预处理出前n项的异或值, ...
随机推荐
- [Bzoj1014][JSOI2008]火星人prefix(无旋Treap&hash)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1014 因为涉及到增加和修改,所以后缀数组就被pass掉了,想到的就是平衡树维护hash值 ...
- dp(最长升序列)
http://poj.org/problem?id=2533 题意:给你n(1-1000)个数,求这n个数的最长升序列. 题解:dp[i]表示以第i个数结尾的最长升序列. #include & ...
- [Bzoj1731]排队布局
洛谷上的翻译是真的哲学♂♂♂ 非常van的题目传送门♂♂♂ 个人认为这题充其量也就是个蓝(nan)题,首先处理-1的情况,-1的情况是不等式组无解,按照差分约束的规则,无解说明出现了负环,先跑一遍以0 ...
- ASP.NET CORE 2.0 模板 (Admin LTE)
原文:https://www.jianshu.com/p/4916f380be66?utm_campaign=hugo&utm_medium=reader_share&utm_cont ...
- JVM(10)之 年老代收集器
开发十年,就只剩下这套架构体系了! >>> 在上一篇博文我们介绍了JAVA新生代收集器,本篇博文我们要讲的就是关于老年代的一些收集器.老年代存活的一般是大对象以及生命很顽强的对象 ...
- 【学习总结】Python-3-字符串运算符与字符串格式化
参考: 本教程的评论区:菜鸟教程-Python3-Python数字 字符串运算符: 实例变量a值为字符串 "Hello",b变量值为 "Python": 字符串 ...
- JavaScript——实现继承的几种方式
实现继承的6中方法: 借用构造函数 组合继承 原型式继承 寄生式继承 寄生组合式继承 拷贝继承 1. 借用构造函数 在子类型构造函数的内部调用超类构造函数.通过使用apply()和call()方法在新 ...
- 【转载】windows 开启 nginx 监听80 端口 以及 禁用 http 服务后,无法重启 HTTP 服务,提示 系统错误 123,文件目录、卷标出错
https://www.cnblogs.com/TianyuSu/p/9509873.html location / { proxy_set_header Host $Host; proxy_set_ ...
- MySQL--18 报错总结
报错1: 报错原因:MySQL的socket文件目录不存在. 解决方法: 创建MySQL的socket文件目录 mkdir /application/mysql-5.6.38/tmp 报错2: 报错原 ...
- Sass字符运算
在 Sass 中可以通过加法符号“+”来对字符串进行连接.例如: $content: "Hello" + "" + "Sass!"; .bo ...