joylintp

AC

Jun 6th, 2021
953
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.46 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. //#pragma gcc optimize("Ofast,unroll-loops")
  5. //#pragma gcc target("sse,sse2,sse3,ssse3,sse4,avx,avx2,fma,abm,mmx,popcnt,tune=native")
  6. //#define int long long
  7. //#define double long double
  8. #define MP make_pair
  9. #define pF first
  10. #define pS second
  11. #define MOD 100000007
  12. #define K 420
  13.  
  14. vector<int> crs(vector<int> a, vector<int> b)
  15. {
  16.     vector<int> ret;
  17.     for (int i = 0; i < a.size(); i++)
  18.         if (a[i] == b[i])
  19.             ret.push_back(a[i]);
  20.         else
  21.             ret.push_back(3 - a[i] - b[i]);
  22.     return ret;
  23. }
  24.  
  25. vector<int> ps;
  26.  
  27. void fk(vector<int> &s, vector<int> &ret, int Lp, int Rp)
  28. {
  29.     for (int i = Lp; i <= Rp; i++)
  30.     {
  31.         ret[i] = 0;
  32.  
  33.         for (int j = ps[i]; j < ps[i + 1]; j++)
  34.             ret[i] = (ret[i] * 3 + s[j]) % MOD;
  35.     }
  36. }
  37.  
  38. signed main()
  39. {
  40.     ios_base::sync_with_stdio(false);
  41.     cin.tie(0);
  42.  
  43.     int N, Q;
  44.     string oT;
  45.     vector<string> oS(3);
  46.     cin >> N >> oS[0] >> oS[1] >> oS[2] >> Q >> oT;
  47.  
  48.     vector<vector<int>> S(3);
  49.     for (int i = 0; i < 3; i++)
  50.         for (int j = 0; j < N; j++)
  51.             if (oS[i][j] == 'J')
  52.                 S[i].push_back(0);
  53.             else if (oS[i][j] == 'O')
  54.                 S[i].push_back(1);
  55.             else
  56.                 S[i].push_back(2);
  57.  
  58.     vector<int> T;
  59.     for (int i = 0; i < N; i++)
  60.         if (oT[i] == 'J')
  61.             T.push_back(0);
  62.         else if (oT[i] == 'O')
  63.             T.push_back(1);
  64.         else
  65.             T.push_back(2);
  66.  
  67.     set<vector<int>> st;
  68.     st.insert(S[0]), st.insert(S[1]), st.insert(S[2]);
  69.  
  70.     bool chg = true;
  71.     int ls = 0;
  72.     while (chg)
  73.     {
  74.         chg = false;
  75.  
  76.         for (int i = 0; i < S.size(); i++)
  77.             for (int j = i + 1; j < S.size(); j++)
  78.             {
  79.                 vector<int> t = crs(S[i], S[j]);
  80.                 if (!st.count(t))
  81.                     st.insert(t), S.push_back(t), chg = true;
  82.             }
  83.     }
  84.  
  85.     int NK = (N - 1) / K + 1;
  86.     ps.resize(NK + 1);
  87.     for (int i = 0; i < NK; i++)
  88.         ps[i] = i * K;
  89.     ps[NK] = N;
  90.  
  91.     vector<vector<int>> vS(S.size(), vector<int>(NK));
  92.     for (int i = 0; i < S.size(); i++)
  93.         fk(S[i], vS[i], 0, NK - 1);
  94.  
  95.     vector<int> vT(NK);
  96.     fk(T, vT, 0, NK - 1);
  97.  
  98.     bool suc = false;
  99.     for (auto v : vS)
  100.         if (v == vT)
  101.             suc = true;
  102.  
  103.     if (suc)
  104.         cout << "Yes\n";
  105.     else
  106.         cout << "No\n";
  107.  
  108.     int A1 = 0;
  109.     for (int i = 0; i < K; i++)
  110.         A1 = (A1 * 3 + 1) % MOD;
  111.  
  112.     vector<int> AS(NK, -1);
  113.     while (Q--)
  114.     {
  115.         char oC;
  116.         int L, R;
  117.         cin >> L >> R >> oC, L--, R--;
  118.  
  119.         int C;
  120.         if (oC == 'J')
  121.             C = 0;
  122.         else if (oC == 'O')
  123.             C = 1;
  124.         else
  125.             C = 2;
  126.  
  127.         int Lp = L / K, Rp = R / K;
  128.         if (AS[Lp] != -1)
  129.             for (int i = ps[Lp]; i < ps[Lp + 1]; i++)
  130.                 T[i] = AS[Lp];
  131.         if (AS[Rp] != -1)
  132.             for (int i = ps[Rp]; i < ps[Rp + 1]; i++)
  133.                 T[i] = AS[Rp];
  134.         AS[Lp] = AS[Rp] = -1;
  135.  
  136.         if (Rp - Lp <= 1)
  137.         {
  138.             for (int i = L; i <= R; i++)
  139.                 T[i] = C;
  140.             fk(T, vT, Lp, Rp);
  141.         }
  142.         else
  143.         {
  144.             for (int i = L; i < ps[Lp + 1]; i++)
  145.                 T[i] = C;
  146.             fk(T, vT, Lp, Lp);
  147.  
  148.             for (int i = R; i >= ps[Rp]; i--)
  149.                 T[i] = C;
  150.             fk(T, vT, Rp, Rp);
  151.  
  152.             Lp++, Rp--;
  153.             for (int i = Lp; i <= Rp; i++)
  154.                 AS[i] = C, vT[i] = A1 * C % MOD;
  155.         }
  156.  
  157.         bool suc = false;
  158.         for (auto v : vS)
  159.             if (v == vT)
  160.                 suc = true;
  161.  
  162.         if (suc)
  163.             cout << "Yes\n";
  164.         else
  165.             cout << "No\n";
  166.     }
  167.  
  168.     return 0;
  169. }
  170.  
  171. //      *   *  *****  *   *  *   *   ****  ****    ****     **    **
  172. //     *   *  *      **  *  *   *  *      *   *  *        * *   * *
  173. //    *****  *****  * * *  *   *  *      ****   *       *  *     *
  174. //   *   *      *  *  **  *   *  *      *  *   *       *****    *
  175. //  *   *  *****  *   *   ***    ****  *   *    ****     *   *****
  176.  
  177. //      *****  *****  *   *  *      *****  *   *  *****  *****
  178. //        *   *   *  *   *  *        *    **  *    *    *   *
  179. //       *   *   *  *****  *        *    * * *    *    *****
  180. //   *  *   *   *    *    *        *    *  **    *    *
  181. //  ****   *****    *    *****  *****  *   *    *    *
  182.  
Advertisement
Add Comment
Please, Sign In to add comment