1. 程式人生 > 其它 >【2022 省選訓練賽 Contest 17 A】字元串游戲(結論)

【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;
}