This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <stdio.h>
#include <string.h>
#define N 200000
#define N_ (1 << 18) /* N_ = pow2(ceil(log2(N))) */
#define MD 0x7fffffff
char *joi = "JOI";
int X = 469762049, Y = 595591169;
int ppx[N + 1], ppy[N + 1];
void init() {
int i;
ppx[0] = ppy[0] = 1;
for (i = 1; i <= N; i++) {
ppx[i] = (long long) ppx[i - 1] * X % MD;
ppy[i] = (long long) ppy[i - 1] * Y % MD;
}
}
int xx_[N_ * 2], yy_[N_ * 2], xx1[N_ * 2][3], yy1[N_ * 2][3], lz[N_], h_, n_;
void put(int i, int d) {
xx_[i] = xx1[i][d], yy_[i] = yy1[i][d];
if (i < n_)
lz[i] = d;
}
void pus(int i) {
if (lz[i] != -1)
put(i << 1 | 0, lz[i]), put(i << 1 | 1, lz[i]), lz[i] = -1;
}
void pul(int i) {
if (lz[i] == -1) {
int l = i << 1, r = l | 1;
xx_[i] = ((long long) xx_[l] + xx_[r]) % MD;
yy_[i] = ((long long) yy_[l] + yy_[r]) % MD;
}
}
void push(int i) {
int h;
for (h = h_; h > 0; h--)
pus(i >> h);
}
void pull(int i) {
while (i > 1)
pul(i >>= 1);
}
void build(char *cc, int n) {
int i, l, r, d;
h_ = 0;
while (1 << h_ < n)
h_++;
n_ = 1 << h_;
for (i = 0; i < n; i++) {
for (d = 0; d < 3; d++) {
xx1[n_ + i][d] = (long long) d * ppx[i] % MD;
yy1[n_ + i][d] = (long long) d * ppy[i] % MD;
}
xx_[n_ + i] = (long long) cc[i] * ppx[i] % MD;
yy_[n_ + i] = (long long) cc[i] * ppy[i] % MD;
}
memset(lz, -1, n_ * sizeof *lz);
for (i = n_ - 1; i > 0; i--) {
l = i << 1, r = l | 1;
for (d = 0; d < 3; d++) {
xx1[i][d] = ((long long) xx1[l][d] + xx1[r][d]) % MD;
yy1[i][d] = ((long long) yy1[l][d] + yy1[r][d]) % MD;
}
pul(i);
}
}
void update(int l, int r, int d) {
int l_ = l += n_, r_ = r += n_;
push(l_), push(r_);
for ( ; l <= r; l >>= 1, r >>= 1) {
if ((l & 1) == 1)
put(l++, d);
if ((r & 1) == 0)
put(r--, d);
}
pull(l_), pull(r_);
}
int main() {
static char ss[3][N + 1], cc[N + 1];
static int xx[3][3], yy[3][3];
int n, q, h, i, a, b, c, d, x, y, yes;
scanf("%d", &n), init();
for (h = 0; h < 3; h++) {
scanf("%s", ss[h]);
for (i = 0; i < n; i++)
ss[h][i] = strchr(joi, ss[h][i]) - joi;
}
for (a = 0; a < 3; a++)
for (b = 0; b < 3; b++) {
c = (4 - a - b) % 3;
x = y = 0;
for (i = 0; i < n; i++) {
d = (ss[0][i] * a + ss[1][i] * b + ss[2][i] * c) % 3;
x = (x + (long long) d * ppx[i]) % MD;
y = (y + (long long) d * ppy[i]) % MD;
}
xx[a][b] = x, yy[a][b] = y;
}
scanf("%d%s", &q, cc);
for (i = 0; i < n; i++)
cc[i] = strchr(joi, cc[i]) - joi;
build(cc, n);
yes = 0;
for (a = 0; a < 3; a++)
for (b = 0; b < 3; b++)
if (xx_[1] == xx[a][b] && yy_[1] == yy[a][b]) {
yes = 1;
goto out;
}
out:
printf(yes ? "Yes\n" : "No\n");
while (q--) {
static char s[2];
int l, r;
scanf("%d%d%s", &l, &r, s), l--, r--;
d = strchr(joi, s[0]) - joi;
update(l, r, d);
yes = 0;
for (a = 0; a < 3; a++)
for (b = 0; b < 3; b++)
if (xx_[1] == xx[a][b] && yy_[1] == yy[a][b]) {
yes = 1;
goto out_;
}
out_:
printf(yes ? "Yes\n" : "No\n");
}
return 0;
}
Compilation message (stderr)
Main.c: In function 'main':
Main.c:102:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
102 | scanf("%d", &n), init();
| ^~~~~~~~~~~~~~~
Main.c:104:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
104 | scanf("%s", ss[h]);
| ^~~~~~~~~~~~~~~~~~
Main.c:119:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
119 | scanf("%d%s", &q, cc);
| ^~~~~~~~~~~~~~~~~~~~~
Main.c:136:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
136 | scanf("%d%d%s", &l, &r, s), l--, r--;
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |