比较水的一个C题,做cf还是得看分数
题意
Ann和Mike做游戏,游戏如下:
给定一个字符串
s
s
s,以及一个初始子串
[
l
,
r
]
[l,r]
[l,r],初始位置
l
=
k
,
r
=
k
l = k,r = k
l=k,r=k,每次操作选择一个新的
l
′
,
r
′
l',r'
l′,r′,
l
′
<
=
l
l' <= l
l′<=l并且
r
′
=
>
r
r' => r
r′=>r,新的子串比原来子串的字典序要小,没有办法再进行操作的人输.Ann为先手,Mike后手,对于每一个
1
<
=
k
<
=
∣
s
∣
1<=k<=|s|
1<=k<=∣s∣,每个人都采取最优的策略,输出赢的人是谁.
分析与解答
对于一个字符串,在当前字符串后边加任何字符只会让字典序变大.对于在当前字符串之前加上字符,开头的字符一定要比当前开头的字符小.作为先手,如果在可以在当前字符之前有比当前字符小的,那么就将左区间拓展到最左能够到达的位置,如果没有就是后手赢.
代码
/*************************************************************************
> File Name: 2019_10_6_3.cpp
> Author: z472421519
> Mail:
> Created Time: 2019年10月06日 星期日 16时23分39秒
************************************************************************/
#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
#define MAXN 500003
using namespace std;
char s[MAXN],num[MAXN];
int main()
{
scanf("%s",s + 1);
num[0] = 'z';
int len = strlen(s + 1);
for(int i = 1;i <= len;i++)
{
num[i] = num[i - 1];
if(s[i] <= num[i])
{
num[i] = s[i];
printf("Mike\n");
}
else
printf("Ann\n");
}
return 0;
}