#include<bits/stdc++.h>
using namespace std;
//=====================================================================================================================================
#define ll long long
#define ld long double
#define fi first
#define se second
#define pb push_back
#define pll pair<ll, ll>
#define pli pair<ll, int>
#define pil pair<int, ll>
#define pii pair<int, int>
#define BIT(i, mask) ((mask >> (i)) & 1)
#define DAOBIT(i, mask) ((mask ^ (1 << i)))
#define OFFBIT(i, mask) ((mask & ~(1 << (i))))
#define ONBIT(i, mask) ((mask | (1 << (i))))
//=====================================================================================================================================
const int N = 1e6 + 7;
const ll mod = 1e9 + 6;
const ll MOD = 1e9 + 7;
const ll inf = 1e18;
//=====================================================================================================================================
void fre(){
freopen("ENCHANTING.INP", "r", stdin);
freopen("ENCHANTING.out", "w", stdout);
}
ll gcd(ll a, ll b){
return b ? gcd(b, a % b) : a;
}
ll lcm(ll a, ll b){
return (a / gcd(a, b)) * b;
}
int n;
string S1, S2, S3;
string T;
int q, L[N], R[N];
char C[N];
char nxt[100][100], ch[] = {'J', 'O', 'I'};
const ll base1 = 137;
const ll base2 = 277;
const ll MOD1 = 127657753, MOD2 = 987654319;
namespace subfull
{
vector<pll> spw;
vector<ll> lazy;
vector<pll> sum;
pll cal(int l, int r)
{
return {(spw[r].fi - spw[l - 1].fi + MOD1) % MOD1, (spw[r].se - spw[l - 1].se + MOD2) % MOD2};
}
pll get_hash(string s)
{
pll ans = {0, 0};
ll pw1 = 1, pw2 = 1;
for (int i = 1; i <= n; i++)
{
ans.fi = (ans.fi + (s[i] - 'A' + 1) * pw1) % MOD1;
ans.se = (ans.se + (s[i] - 'A' + 1) * pw2) % MOD2;
pw1 = pw1 * base1 % MOD1;
pw2 = pw2 * base2 % MOD2;
}
return ans;
}
string combine(string S, string T)
{
string ans = "";
ans += " ";
for (int i = 1; i <= n; i++)
{
char cs = S[i], ct = T[i];
ans += nxt[cs][ct];
}
return ans;
}
string str[10];
vector<pll> hs(10);
void push(int k, int l, int r, ll lz)
{
lazy[k] = lz;
pll p = cal(l, r);
sum[k].fi = lz * p.fi % MOD1;
sum[k].se = lz * p.se % MOD2;
}
void down(int k, int l, int r)
{
if (lazy[k])
{
int mid = (l + r) >> 1;
push(k << 1, l, mid, lazy[k]);
push(k << 1 | 1, mid + 1, r, lazy[k]);
lazy[k] = 0;
}
}
void update(int l, int r, int u, int v, ll val, int k = 1)
{
if (l > v || r < u)
return;
if (u <= l && r <= v)
{
push(k, l, r, val);
return;
}
down(k, l, r);
int mid = (l + r) >> 1;
update(l, mid, u, v, val, k << 1);
update(mid + 1, r, u, v, val, k << 1 | 1);
sum[k].fi = (sum[k << 1].fi + sum[k << 1 | 1].fi) % MOD1;
sum[k].se = (sum[k << 1].se + sum[k << 1 | 1].se) % MOD2;
}
pll get(int l, int r, int u, int v, int k = 1)
{
if (l > v || r < u)
return {0, 0};
if (u <= l && r <= v)
return sum[k];
down(k, l, r);
int mid = (l + r) >> 1;
pll getL = get(l, mid, u, v, k << 1);
pll getR = get(mid + 1, r, u, v, k << 1 | 1);
return {(getL.fi + getR.fi) % MOD1, (getL.se + getR.se) % MOD2};
}
bool check_ans()
{
pll cur = get(1, n, 1, n);
/// debug(cur);
for (int i = 1; i <= 9; i++)
if (hs[i] == cur)
return true;
return false;
}
void solve()
{
spw.assign(n + 1, pll(0, 0));
lazy.resize(4 * n + 5);
sum.resize(4 * n + 5);
S1 = ' ' + S1;
S2 = ' ' + S2;
S3 = ' ' + S3;
T = ' ' + T;
ll pw1 = 1, pw2 = 1;
for (int i = 1; i <= n; i++)
{
spw[i].fi = (spw[i - 1].fi + pw1) % MOD1;
spw[i].se = (spw[i - 1].se + pw2) % MOD2;
pw1 = pw1 * base1 % MOD1;
pw2 = pw2 * base2 % MOD2;
}
str[1] = S1;
str[2] = S2;
str[3] = S3;
str[4] = combine(S1, S2);
str[5] = combine(S1, S3);
str[6] = combine(S2, S3);
str[7] = combine(str[4], S3);
str[8] = combine(str[5], S2);
str[9] = combine(str[6], S1);
for (int i = 1; i <= 9; i++)
hs[i] = get_hash(str[i]);
// for (int i = 1; i <= 9; i++)
// cout << str[i] << ' ' << hs[i].fi << ' ' << hs[i].se << '\n';
for (int i = 1; i <= n; i++)
update(1, n, i, i, T[i] - 'A' + 1);
if (check_ans())
cout << "Yes" << '\n';
else
cout << "No" << '\n';
for (int i = 1; i <= q; i++)
{
update(1, n, L[i], R[i], C[i] - 'A' + 1);
if (check_ans())
cout << "Yes" << '\n';
else
cout << "No" << '\n';
}
}
}
//=====================================================================================================================================
int main(){
cin.tie(0)->sync_with_stdio(0);
// fre();
cin >> n;
cin >> S1 >> S2 >> S3;
cin >> q;
cin >> T;
for (int i = 1; i <= q; i++)
{
cin >> L[i] >> R[i] >> C[i];
}
for (int i = 0; i < 3; i++)
{
char c = ch[i];
nxt[c][c] = c;
for (int j = i + 1; j < 3; j++){
int id = 3 - (i + j);
nxt[ch[i]][ch[j]] = nxt[ch[j]][ch[i]] = ch[id];
}
}
subfull::solve();
return 0;
}
Compilation message (stderr)
Main.cpp: In function 'void fre()':
Main.cpp:32:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
32 | freopen("ENCHANTING.INP", "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:33:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
33 | freopen("ENCHANTING.out", "w", stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| # | 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... |