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 <bits/stdc++.h>
#define ll long long
#define pii pair<int, int>
#define pll pair<ll, ll>
#define F first
#define S second
using namespace std;
vector<string> v(3);
void prod()
{
int old;
for (int t = 1; t <= 4; t++)
{
old = v.size();
for (int i = 0; i < old; i++)
for (int j = 0; j < old; j++)
{
string t;
for (int k = 0; k < v[i].size(); k++)
{
if (v[i][k] == v[j][k])
t.push_back(v[i][k]);
else
{
if (v[i][k] != 'J' && v[j][k] != 'J')
t.push_back('J');
if (v[i][k] != 'O' && v[j][k] != 'O')
t.push_back('O');
if (v[i][k] != 'I' && v[j][k] != 'I')
t.push_back('I');
}
}
v.emplace_back(t);
}
sort(v.begin(), v.end());
v.resize(unique(v.begin(), v.end()) - v.begin());
}
}
int N, Q;
const ll base[2] = {7, 11}, mod[2] = {1234567891, 1611495397};
ll p[2000005][2];
pll operator+(pll p1, pll p2)
{
return pll((p1.F + p2.F) % mod[0], (p1.S + p2.S) % mod[1]);
}
struct sumSeg
{
pll seg[800005];
int lazy[800005];
pll getval(int i, int L, int R)
{
if (lazy[i])
return pll((p[R][0] - p[L - 1][0] + mod[0]) * lazy[i] % mod[0],
(p[R][1] - p[L - 1][1] + mod[1]) * lazy[i] % mod[1]);
else
return seg[i];
}
void modify(int mL, int mR, int val, int i = 1, int L = 1, int R = N)
{
if (R < mL || mR < L)
return;
else if (mL <= L && R <= mR)
{
lazy[i] = val;
}
else
{
int mid = (L + R) / 2;
if (lazy[i])
lazy[i << 1] = lazy[i << 1 | 1] = lazy[i];
lazy[i] = 0;
modify(mL, mR, val, i << 1, L, mid);
modify(mL, mR, val, i << 1 | 1, mid + 1, R);
seg[i] = getval(i << 1, L, mid) + getval(i << 1 | 1, mid + 1, R);
}
}
} seg;
int JOI(char c)
{
return (c == 'J' ? 1 : (c == 'O' ? 2 : 3));
}
map<pll, bool> mp;
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> N;
p[0][0] = p[0][1] = 1;
for (int i = 1; i <= N; i++)
p[i][0] = p[i - 1][0] * base[0] % mod[0],
p[i][1] = p[i - 1][1] * base[1] % mod[1];
cin >> v[0] >> v[1] >> v[2];
prod();
for (string s : v)
{
pll h = pll(0, 0);
for (int i = 0; i < N; i++)
h = h + pll(JOI(s[i]) * p[i + 1][0], JOI(s[i]) * p[i + 1][1]);
mp[h] = 1;
}
for (int i = 1; i <= N; i++)
p[i][0] = (p[i - 1][0] + p[i][0]) % mod[0],
p[i][1] = (p[i - 1][1] + p[i][1]) % mod[1];
cin >> Q;
string s;
cin >> s;
for (int i = 0; i < N; i++)
seg.modify(i + 1, i + 1, JOI(s[i]));
cout << ((mp.count(seg.getval(1, 1, N))) ? "Yes\n" : "No\n");
for (int i = 1; i <= Q; i++)
{
int L, R;
char c;
cin >> L >> R >> c;
seg.modify(L, R, JOI(c));
cout << ((mp.count(seg.getval(1, 1, N))) ? "Yes\n" : "No\n");
}
}
/*
JJJOJJIOOOIOOJIIIJIIOJJOOII
JJOJJIJOOIOOJOIIJIIOIOIJIOJ
JOJJIJJOIOOJOOIJIIOIIIOIJJO
*/
Compilation message (stderr)
Main.cpp: In function 'void prod()':
Main.cpp:21:35: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
21 | for (int k = 0; k < v[i].size(); k++)
| ~~^~~~~~~~~~~~~
# | 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... |