博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
字典树+博弈 CF 455B A Lot of Games(接龙游戏)
阅读量:5790 次
发布时间:2019-06-18

本文共 1190 字,大约阅读时间需要 3 分钟。

 

题意:

  A和B轮流在建造一个字,每次添加一个字符,要求是给定的n个串的某一个的前缀,不能添加字符的人输掉游戏,输掉的人先手下一轮的游戏。问A先手,经过k轮游戏,最后胜利的人是谁。

思路:

  很显然先将n个字符串插入到字典树上,因为字典树上有分叉,不能仅仅判断字符串长度奇偶性来判断。字典树看成无环的状态图,如果按照拓扑排序逆序进行排序,在判断每个节点的时候,它的后继都已经判断过了。定义两个数组can_win[u], can_lose[u],表示u节点走下去“可能赢吗?”以及u节点走下去”可能输吗?“,那么取反就是必胜和必败态了,“可能赢”<-对手下一步不可能赢,”可能输“<-对手下一步不可能输。

代码:

#include 
const int N = 1e5 + 5;char str[N];int ch[N][26];int sz;bool can_win[N], can_lose[N];void init() { memset (ch[0], 0, sizeof (ch[0])); sz = 1;}void insert(char *s) { int u = 0, c; for (int i=0; s[i]; ++i) { c = s[i] - 'a'; if (!ch[u][c]) { memset (ch[sz], 0, sizeof (ch[sz])); ch[u][c] = sz++; } u = ch[u][c]; }}void DFS(int u) { can_win[u] = can_lose[u] = false; bool is_leaf = true; for (int c=0; c<26; ++c) { int v = ch[u][c]; if (v) { is_leaf = false; DFS (v); can_win[u] |= !can_win[v]; can_lose[u] |= !can_lose[v]; } } if (is_leaf) { can_lose[u] = true; }}int main() { int n, k; scanf ("%d%d", &n, &k); init (); for (int i=0; i

  

转载于:https://www.cnblogs.com/Running-Time/p/5674693.html

你可能感兴趣的文章
iOS的主要框架介绍 (转载)
查看>>
react报错this.setState is not a function
查看>>
poj 1183
查看>>
从根本解决跨域(nginx部署解决方案)
查看>>
javascript实现的一个信息提示的小功能/
查看>>
Centos7.x:开机启动服务的配置和管理
查看>>
HTML5 浏览器返回按钮/手机返回按钮事件监听
查看>>
xss
查看>>
iOS:百度长语音识别具体的封装:识别、播放、进度刷新
查看>>
JS获取服务器时间并且计算距离当前指定时间差的函数
查看>>
华为硬件工程师笔试题
查看>>
jquery居中窗口-页面加载直接居中
查看>>
cd及目录快速切换
查看>>
Unity Shaders and Effects Cookbook (3-5) 金属软高光
查看>>
31-hadoop-hbase-mapreduce操作hbase
查看>>
C++ 代码风格准则:POD
查看>>
linux-友好显示文件大小
查看>>
【转】【WPF】WPF中MeasureOverride ArrangeOverride 的理解
查看>>
【转】二叉树的非递归遍历
查看>>
NYOJ283对称排序
查看>>