Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- //#pragma gcc optimize("Ofast,unroll-loops")
- //#pragma gcc target("sse,sse2,sse3,ssse3,sse4,avx,avx2,fma,abm,mmx,popcnt,tune=native")
- //#define int long long
- //#define double long double
- #define MP make_pair
- #define pF first
- #define pS second
- #define MOD 100000007
- #define K 420
- string crs(string a, string b)
- {
- string ret;
- for (int i = 0; i < a.size(); i++)
- if (a[i] == b[i])
- ret += a[i];
- else
- ret += 'J' + 'O' + 'I' - a[i] - b[i];
- return ret;
- }
- vector<int> ps;
- void fk(string s, vector<int> &ret, int Lp, int Rp)
- {
- for (int i = Lp; i <= Rp; i++)
- {
- ret[i] = 0;
- for (int j = ps[i]; j < ps[i + 1]; j++)
- if (s[j] == 'J')
- ret[i] = ret[i] * 3 % MOD;
- else if (s[j] == 'O')
- ret[i] = (ret[i] * 3 + 1) % MOD;
- else
- ret[i] = (ret[i] * 3 + 2) % MOD;
- }
- }
- signed main()
- {
- ios_base::sync_with_stdio(false);
- cin.tie(0);
- int N, Q;
- string T;
- vector<string> S(3);
- cin >> N >> S[0] >> S[1] >> S[2] >> Q >> T;
- set<string> st;
- st.insert(S[0]), st.insert(S[1]), st.insert(S[2]);
- bool chg = true;
- int ls = 0;
- while (chg)
- {
- chg = false;
- for (int i = 0; i < S.size(); i++)
- for (int j = i + 1; j < S.size(); j++)
- {
- string t = crs(S[i], S[j]);
- if (!st.count(t))
- st.insert(t), S.push_back(t), chg = true;
- }
- }
- int NK = (N - 1) / K + 1;
- ps.resize(NK + 1);
- for (int i = 0; i < NK; i++)
- ps[i] = i * K;
- ps[NK] = N;
- vector<vector<int>> vS(S.size(), vector<int>(NK));
- for (int i = 0; i < S.size(); i++)
- fk(S[i], vS[i], 0, NK - 1);
- vector<int> vT(NK);
- fk(T, vT, 0, NK - 1);
- bool suc = false;
- for (auto v : vS)
- if (v == vT)
- suc = true;
- if (suc)
- cout << "Yes\n";
- else
- cout << "No\n";
- int A1 = 0;
- for (int i = 0; i < K; i++)
- A1 = (A1 * 3 + 1) % MOD;
- vector<char> AS(NK, 'X');
- while (Q--)
- {
- char C;
- int L, R;
- cin >> L >> R >> C, L--, R--;
- int Lp = L / K, Rp = R / K;
- if (AS[Lp] != 'X')
- for (int i = ps[Lp]; i < ps[Lp + 1]; i++)
- T[i] = AS[Lp];
- if (AS[Rp] != 'X')
- for (int i = ps[Rp]; i < ps[Rp + 1]; i++)
- T[i] = AS[Rp];
- AS[Lp] = AS[Rp] = 'X';
- if (Rp - Lp <= 1)
- {
- for (int i = L; i <= R; i++)
- T[i] = C;
- fk(T, vT, Lp, Rp);
- }
- else
- {
- for (int i = L; i < ps[Lp + 1]; i++)
- T[i] = C;
- fk(T, vT, Lp, Lp);
- for (int i = R; i >= ps[Rp]; i--)
- T[i] = C;
- fk(T, vT, Rp, Rp);
- Lp++, Rp--;
- for (int i = Lp; i <= Rp; i++)
- {
- AS[i] = C;
- if (C == 'J')
- vT[i] = 0;
- else if (C == 'O')
- vT[i] = A1;
- else
- vT[i] = A1 * 2 % MOD;
- }
- }
- bool suc = false;
- for (auto v : vS)
- if (v == vT)
- suc = true;
- if (suc)
- cout << "Yes\n";
- else
- cout << "No\n";
- }
- return 0;
- }
- // * * ***** * * * * **** **** **** ** **
- // * * * ** * * * * * * * * * * *
- // ***** ***** * * * * * * **** * * * *
- // * * * * ** * * * * * * ***** *
- // * * ***** * * *** **** * * **** * *****
- // ***** ***** * * * ***** * * ***** *****
- // * * * * * * * ** * * * *
- // * * * ***** * * * * * * *****
- // * * * * * * * * ** * *
- // **** ***** * ***** ***** * * * *
Advertisement
Add Comment
Please, Sign In to add comment