ABC209 E Shiritori
考虑对这个问题进行转化:
显然我们只关注每个串前三个棋子和后三个棋子,并且根据题目的特性,我们可以将任意的三个字符看作点,将一个字符串看作连接两个点的边,这样我们得到了一张点数为 \(52 ^ 3\),边数为 \(n\) 的有向图。
此时问题就转化为:两个人在一张有向图上博弈,轮流操作。有一个棋子在点上,每次可以将该棋子移动到一个后继节点,不能动的人输。在先手后手都走最优策略的情况下,请问棋子一开始在每个节点最终局面的输赢 / 平局状态。
如果该图为一张 \(\rm DAG\),那么这个问题非常简单,若存在环,问题就变得复杂了。
但不论问题如何变化,这依然满足博弈论状态的转移关系。
我们类似 \(\rm DAG\) 的做法令 \(f_i\) 为棋子在节点 \(i\) 开始为必胜(1),必败(0),平局(-1)。
对于每个节点,若节点 \(i\) 的后继存在一个必败态节点,那么该点为必胜态;若节点 \(i\) 的所有后继均为必胜态,那么该点为必败态。
据此,我们先通过能确定的点将该图所有必胜态必败态的节点求出(因为这些节点的后继一定不存在节点状态不确定)。
此时我们发现,那些没有确定状态的点,后继中确定了状态的点一定是必胜且一定存在一个点没有确定状态。
注意到任何一个人都不会直接移到必胜态上去,因此双方都只会移到不确定的状态上去。
此时就会在不确定的状态上开始无限循环操作,因此所有没有确定状态的节点都是平局节点。
可以发现上述做法的复杂度瓶颈在于求出可以确定状态的节点,这部分用类似拓扑排序的方式是 \(\mathcal{O}(n)\) 的。
ABC209 E Shiritori的更多相关文章
- AtCoder Beginner Contest-060
A - Shiritori Problem Statement You are given three strings A, B and C. Check whether they form a wo ...
- 2018.09.08 AtCoder Beginner Contest 109简要题解
比赛传送门 水题大赛? 全是水题啊!!! T1 ABC333 就是判断是不是两个数都是奇数就行了. 代码: #include<bits/stdc++.h> using namespace ...
随机推荐
- 写了个适用于vscode的minio图床客户端插件
缘起 自己搭建minio做我的个人博客图床好一段时间了, 一直用minio自带的web管理后台来上传图片, 它的界面长下面这个样子 上传完后, 需要点下文件列表里刚刚传上去的文件的分享按钮 然后会出来 ...
- Chapter 5 Interaction
目录 5.1 Interaction requires a joint intervention 5.2 Identifying interaction 5.3 Counterfactual resp ...
- 从源码看全局异常处理器@ExceptionHandler&@ExceptionHandler的生效原理
1.开头在前 日常开发中,几乎我们的项目都会用到异常处理器,我们通常会定制属于自己的异常处理器,来处理项目中大大小小.各种各样的异常.配置异常处理器目前最常用的方式应该是使用@ControllerAd ...
- Java初学者作业——定义一个计算器类, 实现计算器类中加、 减、 乘、 除的运算方法, 每个方法能够接收2个参数。
返回本章节 返回作业目录 需求说明: 定义一个计算器类, 实现计算器类中加. 减. 乘. 除的运算方法, 每个方法能够接收2个参数. 实现思路: 定义计算器类. 定义计算器类中加.减.乘.除的方法. ...
- Java练习习题,百钱买百鸡问题,用100文钱买鸡,公鸡5文钱一只,母鸡3文钱一只,小鸡3只1文钱
需求说明: 用100文钱买鸡,公鸡5文钱一只,母鸡3文钱一只,小鸡3只1文钱,要求公鸡.母鸡.小鸡都必须要有,刚好用完100文钱,公鸡.母鸡.小鸡的数量之和也是100. public class te ...
- java并发系列——底层CPU
java并发有诸多难点,实际上并非java语言本身的问题,本质上说一部分是因为并发操作本身的问题,另外一部分是因为计算机体系结构带来的.为了更好地理解java并发过程中的问题,我们应该对CPU有一些基 ...
- MYSQL架构理解
目录 一.MYSQL架构 1. 架构图 2.分层实现 3.查询组件 二.并发控制 三. 事务 四.引擎 摘自 通过对MYSQL重要的几个属性的理解,建立一个基本的MYSQL的知识框架 一.MYSQL架 ...
- pycharm debug调试模式报“UnicodeDecodeError:'gdk' codec can't decode byte 0xac”,无法正常调试
遇到的问题: 本机python 3.8 pycharn 3.4.4 运行代码的时候,选择debug模式,提示"UnicodeDecodeError:'gdk' codec can't dec ...
- unittest_测试报告(6)
用例执行完成后,执行结果默认是输出在屏幕上,其实我们可以把结果输出到一个文件中,形成测试报告. unittest自带的测试报告是文本形式的,如下代码: import unittest if __nam ...
- bind 标签
<select id="finduserbylikename" parameterType="string" resultMap="cour ...