这是本文档旧的修订版!
题目大意:给定一个无向图,初始时有一个token在s点,两个玩家Join Player和Cut Player轮流行动,CutPlayer先动。Cut Player每次可以移除一条和token所在位置相邻的边, Join Player每次可以将token沿着一条未删除边移动, 如果token在某刻被移动到t则Join Player获胜,否则Cut Player获胜,求双方最优策略下的胜者。
从 $t$ 考虑,能够走到 $t$ 的点与 $t$ 必有两条及以上的边相连,将这些点和 $t$ 加入集合,若其他点有两条及以上的边连向该集合,则再将这些点加入集合,最后若 $s$ 在集合中则 Join Player 胜利,否则 Cut Player 胜利。
时间复杂度 $O(n+m)$
题目大意:给定只包含'r'、'e'、'd'、'?'四种字符的字符串,其中'?'可表示为任意字符,询问该字符串是否能被拆为若干个“red”
和括号匹配类似,要求从左到右$cnt( r )\geq cnt(e)\geq cnt(d)$,并且从右到左$cnt( r )\leq cnt(e)\leq cnt(d)$
字母'e'的限制是关键,如果解决了字母'e'的限制,只要对所有'?',从左到右依次放'r'、'e'、'd'即可
用并查集维护某位置左边最近'?'的位置,然后从左到右扫一遍字符串,若'e'的数量不够,则把左边最近的'?'改为'e'
同理,从右向左做一遍类似的操作,就可以解决'e'的限制
解决'e'的限制之后,按顺序填好剩下'?'的值,然后检查字符串是否合法