【2022 省選訓練賽 Contest 17 A】字元串游戲(結論)
阿新 • • 發佈:2022-03-23
字元串游戲
題目連結:2022 省選訓練賽 Contest 17 A
題目大意
有一個字串一開始是空的,兩個人輪流操作在任意位置插入 0/1。
然後給你一個串 s,先手目標是使得 s 是字串的子串,後手目標則是阻止先手。
然後問你在無限下去的時候是否會讓先手贏。
思路
先直接給結論:當出現的連續的 \(0/1\) 的數量都不超過 \(2\) 且長度為 \(2\) 的只有一個的時候先手必勝。
否則先手必輸。
首先我們是可以知道兩個人都一定可以使得序列變成 \(01\) 操作的樣子,並一直維護它(無論是哪一方想維護都可以)
就只要在別人造出 \(00\) 或者 \(11\) 的時候在中間插一個不一樣的即可。
那我們先手要贏要麼 \(s\)
程式碼
#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; }