COW Operations (USACO Silver 2022 Open)
COW Operations (USACO Silver 2022 Open)
- C,O,W相邻的字母可以互换:CO -> OWWC -> OC
- 两个相邻不同字母可以变成第三个,例如:OW -> CWW (O变成CW) -> C
- 所以可以把所有相同字母者都放到一起,然后看C,O,W个数的奇偶性
- 奇偶偶可以:这样所有偶全部自己消掉,然后奇数个C变成一个C
- 偶奇奇也可以:奇数个O变成一个O,奇数个W变成一个W,OW变成C,消掉一个C,最后剩下奇数个C,再变成一个C。
- 其它情况都不可以。
- 回到原问题,就可以用三个计数器解决。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int sum[3][200005]; // C,O,W
char s[200005];
int slen;
int q; // 2e5
int main() {
scanf("%s", s);
slen = strlen(s);
for (int i = 1; i <= slen; i++) {
sum[0][i] = sum[0][i-1]; sum[1][i] = sum[1][i-1]; sum[2][i] = sum[2][i-1];
if (s[i-1] == 'C')
sum[0][i]++;
else if (s[i-1] == 'O')
sum[1][i]++;
else
sum[2][i]++;
}
scanf("%d", &q);
for (int i = 0; i < q; i++) {
int l,r;
scanf("%d %d", &l, &r);
int c = (sum[0][r] - sum[0][l-1]) % 2;
int o = (sum[1][r] - sum[1][l-1]) % 2;
int w = (sum[2][r] - sum[2][l-1]) % 2;
if (c == 1 && o == 0 && w == 0 || c == 0 && o == 1 && w == 1)
printf("Y");
else
printf("N");
}
return 0;
}