【2022 省选训练赛 Contest 17 A】字符串游戏(结论)
字符串游戏
题目链接:2022 省选训练赛 Contest 17 A
题目大意
有一个字符串一开始是空的,两个人轮流操作在任意位置插入 0/1。
然后给你一个串 s,先手目标是使得 s 是字符串的子串,后手目标则是阻止先手。
然后问你在无限下去的时候是否会让先手赢。
思路
先直接给结论:当出现的连续的 \(0/1\) 的数量都不超过 \(2\) 且长度为 \(2\) 的只有一个的时候先手必胜。
否则先手必输。
首先我们是可以知道两个人都一定可以使得序列变成 \(01\) 操作的样子,并一直维护它(无论是哪一方想维护都可以)
就只要在别人造出 \(00\) 或者 \(11\) 的时候在中间插一个不一样的即可。
那我们先手要赢要么 \(s\) 串就是这样的,要么就是自己造出唯一的 \(00/11\) 所以就是这个结论了。
代码
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 1000 + 10;
int n;
char s[N];
void work() {
bool mak = 0;
scanf("%s", s + 1); n = strlen(s + 1);
for (int L = 1, R; L <= n; L = R + 1) {
R = L; while (R < n && s[R + 1] == s[L]) R++;
if (R - L + 1 > 2) {
printf("Owaski\n"); return ;
}
else if (R - L + 1 == 2) {
if (mak) {
printf("Owaski\n"); return ;
}
else mak = 1;
}
}
printf("Zhangzj\n");
}
int main() {
int T; scanf("%d", &T);
while (T--) {
work();
}
return 0;
}