joylintp

TLE

Jun 6th, 2021
935
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.15 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. string crs(string a, string b)
  15. {
  16.     string ret;
  17.     for (int i = 0; i < a.size(); i++)
  18.         if (a[i] == b[i])
  19.             ret += a[i];
  20.         else
  21.             ret += 'J' + 'O' + 'I' - a[i] - b[i];
  22.     return ret;
  23. }
  24.  
  25. vector<int> ps;
  26.  
  27. void fk(string 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.             if (s[j] == 'J')
  35.                 ret[i] = ret[i] * 3 % MOD;
  36.             else if (s[j] == 'O')
  37.                 ret[i] = (ret[i] * 3 + 1) % MOD;
  38.             else
  39.                 ret[i] = (ret[i] * 3 + 2) % MOD;
  40.     }
  41. }
  42.  
  43. signed main()
  44. {
  45.     ios_base::sync_with_stdio(false);
  46.     cin.tie(0);
  47.  
  48.     int N, Q;
  49.     string T;
  50.     vector<string> S(3);
  51.     cin >> N >> S[0] >> S[1] >> S[2] >> Q >> T;
  52.  
  53.     set<string> st;
  54.     st.insert(S[0]), st.insert(S[1]), st.insert(S[2]);
  55.  
  56.     bool chg = true;
  57.     int ls = 0;
  58.     while (chg)
  59.     {
  60.         chg = false;
  61.  
  62.         for (int i = 0; i < S.size(); i++)
  63.             for (int j = i + 1; j < S.size(); j++)
  64.             {
  65.                 string t = crs(S[i], S[j]);
  66.                 if (!st.count(t))
  67.                     st.insert(t), S.push_back(t), chg = true;
  68.             }
  69.     }
  70.  
  71.     int NK = (N - 1) / K + 1;
  72.     ps.resize(NK + 1);
  73.     for (int i = 0; i < NK; i++)
  74.         ps[i] = i * K;
  75.     ps[NK] = N;
  76.  
  77.     vector<vector<int>> vS(S.size(), vector<int>(NK));
  78.     for (int i = 0; i < S.size(); i++)
  79.         fk(S[i], vS[i], 0, NK - 1);
  80.  
  81.     vector<int> vT(NK);
  82.     fk(T, vT, 0, NK - 1);
  83.  
  84.     bool suc = false;
  85.     for (auto v : vS)
  86.         if (v == vT)
  87.             suc = true;
  88.  
  89.     if (suc)
  90.         cout << "Yes\n";
  91.     else
  92.         cout << "No\n";
  93.  
  94.     int A1 = 0;
  95.     for (int i = 0; i < K; i++)
  96.         A1 = (A1 * 3 + 1) % MOD;
  97.  
  98.     vector<char> AS(NK, 'X');
  99.     while (Q--)
  100.     {
  101.         char C;
  102.         int L, R;
  103.         cin >> L >> R >> C, L--, R--;
  104.  
  105.         int Lp = L / K, Rp = R / K;
  106.         if (AS[Lp] != 'X')
  107.             for (int i = ps[Lp]; i < ps[Lp + 1]; i++)
  108.                 T[i] = AS[Lp];
  109.         if (AS[Rp] != 'X')
  110.             for (int i = ps[Rp]; i < ps[Rp + 1]; i++)
  111.                 T[i] = AS[Rp];
  112.         AS[Lp] = AS[Rp] = 'X';
  113.  
  114.         if (Rp - Lp <= 1)
  115.         {
  116.             for (int i = L; i <= R; i++)
  117.                 T[i] = C;
  118.             fk(T, vT, Lp, Rp);
  119.         }
  120.         else
  121.         {
  122.             for (int i = L; i < ps[Lp + 1]; i++)
  123.                 T[i] = C;
  124.             fk(T, vT, Lp, Lp);
  125.  
  126.             for (int i = R; i >= ps[Rp]; i--)
  127.                 T[i] = C;
  128.             fk(T, vT, Rp, Rp);
  129.  
  130.             Lp++, Rp--;
  131.             for (int i = Lp; i <= Rp; i++)
  132.             {
  133.                 AS[i] = C;
  134.                 if (C == 'J')
  135.                     vT[i] = 0;
  136.                 else if (C == 'O')
  137.                     vT[i] = A1;
  138.                 else
  139.                     vT[i] = A1 * 2 % MOD;
  140.             }
  141.         }
  142.  
  143.         bool suc = false;
  144.         for (auto v : vS)
  145.             if (v == vT)
  146.                 suc = true;
  147.  
  148.         if (suc)
  149.             cout << "Yes\n";
  150.         else
  151.             cout << "No\n";
  152.     }
  153.  
  154.     return 0;
  155. }
  156.  
  157. //      *   *  *****  *   *  *   *   ****  ****    ****     **    **
  158. //     *   *  *      **  *  *   *  *      *   *  *        * *   * *
  159. //    *****  *****  * * *  *   *  *      ****   *       *  *     *
  160. //   *   *      *  *  **  *   *  *      *  *   *       *****    *
  161. //  *   *  *****  *   *   ***    ****  *   *    ****     *   *****
  162.  
  163. //      *****  *****  *   *  *      *****  *   *  *****  *****
  164. //        *   *   *  *   *  *        *    **  *    *    *   *
  165. //       *   *   *  *****  *        *    * * *    *    *****
  166. //   *  *   *   *    *    *        *    *  **    *    *
  167. //  ****   *****    *    *****  *****  *   *    *    *
  168.  
Advertisement
Add Comment
Please, Sign In to add comment