【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;
}
posted @ 2022-03-23 20:10  あおいSakura  阅读(27)  评论(0编辑  收藏  举报