我们先以下面的字符串举例:"afnabasfoab"
不难想到,最后一个'b',谁的 t 串添加到这里谁就赢了。那么字符串标记为 。其中中括号为必胜区间。
那么,这个 b 到上一个 b 之间所有的字母都是必败的。因为如果某人“不小心”取到了这些字母中的任意一个,对方只要在后面加一个 'b' ,就直接到了最后一个 b 了。
因此,第五个字母 'b' 后面这些字母都是必败的。字符串标记为 。其中小括号为必败区间。
那么第四个字母'a'就是必胜的,因为只要某人取到了这个 a ,对方就不得不取后面的小括号区间的某个字母,导致失败。
以此类推,字符串可以标记为 。标记的逻辑是:最后一个字母
为必胜,那么找到它前面离它最近的那个
,这段区间为必败。必败区间前面的那个字母为必胜,以此类推,标记出所有区间。
那么怎么评定胜负的标准呢?很简单,若第一个字母在必败区间,那么小红必败。否则小红必胜,因为小红可以直接取到第一个必败区间前面的那一个字母,迫使紫m去取必败区间。
彩蛋:如果要求每次添加的时候t都是s的子串,解法是后缀自动机next指针dag图上求sg函数,恕出题人不会qwq
参考代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
cin>>s;
int i,j=s.length()-1;
for(i=j-1;i>=0;i--){
if(s[i]==s[j])j=i-1,i=j;
}
if(j==-1)cout<<"yukari";
else cout<<"kou";
}

京公网安备 11010502036488号