Luogu Link | Codeforces Link
\(\texttt{Describe}\)
給一個長度為 \(n\) 的二進位制序列,Alice 和 Bob 在相鄰兩個0/1中間分別加 \(\operatorname{or}\) 或 \(\operatorname{and}\) 操作,優先順序滿足 \(\operatorname{and} > \operatorname{or}\)。
Alice 希望最後運算的值為 \(1\),Bob 希望它為 \(0\)。
若雙方進行最優操作,問最後值為 \(0\)(YES
)還是 \(1\)(NO
)。
\(\texttt{Solution}\)
Hits 1: 觀察首尾性質
注意到當序列首是 \(1\) 的時候,只要 Alice 在後面加個 \(\operatorname{or}\),整個序列的值一定為 \(1\)。
同理當序列尾是 \(1\) 的時候,值也為 \(1\)。
另外,當序列出現了 \(\dots 11 \dots\) 的時候,Alice 一定可以構造出 \(\dots \operatorname{or} 1 \dots 1 \operatorname{or}\) 或者 \(\dots 1 \operatorname{or} 1 \operatorname{or} \dots\) 的形式使得整個序列為 \(1\)。
判斷即可。
\(\texttt{Code}\)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
void solve() {
int n; cin >> n;
string s; cin >> s;
if ((s.back() == '1' || s.front() == '1') || s.find("11") != s.npos) {
cout << "YES\n";
}else {
cout << "NO\n";
}
}
int main() {
ios::sync_with_stdio(false); cin.tie(0), cout.tie(0);
int T; cin >> T; while (T --) solve();
return 0;
}