考虑对这个问题进行转化:
显然我们只关注每个串前三个棋子和后三个棋子,并且根据题目的特性,我们可以将任意的三个字符看作点,将一个字符串看作连接两个点的边,这样我们得到了一张点数为 (52 ^ 3),边数为 (n) 的有向图。
此时问题就转化为:两个人在一张有向图上博弈,轮流操作。有一个棋子在点上,每次可以将该棋子移动到一个后继节点,不能动的人输。在先手后手都走最优策略的情况下,请问棋子一开始在每个节点最终局面的输赢 / 平局状态。
如果该图为一张 ( m DAG),那么这个问题非常简单,若存在环,问题就变得复杂了。
但不论问题如何变化,这依然满足博弈论状态的转移关系。
我们类似 ( m DAG) 的做法令 (f_i) 为棋子在节点 (i) 开始为必胜(1),必败(0),平局(-1)。
对于每个节点,若节点 (i) 的后继存在一个必败态节点,那么该点为必胜态;若节点 (i) 的所有后继均为必胜态,那么该点为必败态。
据此,我们先通过能确定的点将该图所有必胜态必败态的节点求出(因为这些节点的后继一定不存在节点状态不确定)。
此时我们发现,那些没有确定状态的点,后继中确定了状态的点一定是必胜且一定存在一个点没有确定状态。
注意到任何一个人都不会直接移到必胜态上去,因此双方都只会移到不确定的状态上去。
此时就会在不确定的状态上开始无限循环操作,因此所有没有确定状态的节点都是平局节点。
可以发现上述做法的复杂度瓶颈在于求出可以确定状态的节点,这部分用类似拓扑排序的方式是 (mathcal{O}(n)) 的。