COW Operations (USACO Silver 2022 Open)

COW Operations (USACO Silver 2022 Open)

  1. C,O,W相邻的字母可以互换:CO -> OWWC -> OC
  2. 两个相邻不同字母可以变成第三个,例如:OW -> CWW (O变成CW) -> C
  3. 所以可以把所有相同字母者都放到一起,然后看C,O,W个数的奇偶性
    1. 奇偶偶可以:这样所有偶全部自己消掉,然后奇数个C变成一个C
    2. 偶奇奇也可以:奇数个O变成一个O,奇数个W变成一个W,OW变成C,消掉一个C,最后剩下奇数个C,再变成一个C。
    3. 其它情况都不可以。
  4. 回到原问题,就可以用三个计数器解决。
#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;
}