Advertisement
Guest User

Untitled

a guest
Dec 12th, 2019
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.38 KB | None | 0 0
  1. #pragma GCC optimize("Ofast")
  2. #pragma GCC target("popcnt")
  3. #pragma GCC target("avx,avx2,fma")
  4. #include <bits/stdc++.h>
  5. #define watch(x) std::cerr << #x << " = " << (x)
  6. #define watchln(x) watch(x) << std::endl
  7. using ull = unsigned long long;
  8. ull table[65][65];
  9. const int TABLE_FILLED = [](){
  10.     for (int begin = 0; begin <= 64; begin++) {
  11.         for (int end = begin; end <= 64; end++) {
  12.             const auto fi = (begin == 64) ? ull(0) : (ull(-1) << begin);
  13.             const auto se = (end == 0) ? ull(0) : (ull(-1) >> (64 - end));
  14.             table[begin][end] = fi & se;
  15.         }
  16.     }
  17.     return 1;
  18. }();
  19. int cntbit(ull mask, int begin, int end) {
  20.     return __builtin_popcountll(mask & table[begin][end]);
  21. }
  22. template<int value>
  23. void setbit(ull& mask, int begin, int end) {
  24.     mask = (mask & ~table[begin][end]) | (value == 1 ? table[begin][end] : ull(0));
  25. }
  26.  
  27. void setbit(ull& mask, int begin, int end, int v) {
  28.     if (v) { setbit<1>(mask,begin,end); }
  29.     else { setbit<0>(mask,begin,end); }
  30. }
  31. #define all(x) (x).begin(),(x).end()
  32. template<int size>
  33. struct Bitset {
  34.     std::array<ull, (size + 63)/ 64> data;
  35.     void clear() { std::fill(all(data), ull(0)); }
  36.     Bitset() { clear(); }
  37.     void set(int p, int v) {
  38.         if (v) { setbit<1>(data[p / 64], p % 64, p % 64+1); }
  39.         else { setbit<0>(data[p / 64], p % 64, p % 64+1); }
  40.     }
  41.     int get(int p) {
  42.         return (data[p / 64] >> (p % 64)) & 1;
  43.     }
  44.     int& set(int l, int r, int v, int& delta) {
  45.         const int gl = l / 64, gr = r / 64;
  46.         if (gl == gr) {
  47.             delta -= __builtin_popcountll(data[gl]);
  48.             setbit(data[gl], l % 64, r % 64 + 1, v);
  49.             delta += __builtin_popcountll(data[gl]);
  50.         } else {
  51.             delta -= __builtin_popcountll(data[gl]) + __builtin_popcountll(data[gr]);
  52.             setbit(data[gl], l%64,64,v);
  53.             setbit(data[gr], 0,r%64+1,v);
  54.             delta += __builtin_popcountll(data[gl]) + __builtin_popcountll(data[gr]);
  55.             const ull val = (v) ? ull(-1) : ull(0);
  56.             const int add = v * 64;
  57.             for (int g = gl+1; g < gr; g++) {
  58.                 delta += add - __builtin_popcountll(data[g]);
  59.                 data[g] = val;
  60.             }
  61.         }
  62.         return delta;
  63.     }
  64.     void set(int l, int r, int v) {
  65.         int delta = 0;
  66.         set(l,r,v,delta);
  67.     }
  68.     int get(int l, int r) {
  69.         const int gl = l / 64, gr = r / 64;
  70.         if (gl == gr) {
  71.             return cntbit(data[gl], l % 64, r % 64 + 1);
  72.         } else {
  73.             int answ = cntbit(data[gl], l%64,64) + cntbit(data[gr], 0,r%64+1);
  74.             for (int g = gl+1; g < gr; g++) {
  75.                 answ += __builtin_popcountll(data[g]);
  76.             }
  77.             return answ;
  78.         }
  79.     }
  80. };
  81. template<int size, int gsize>
  82. struct SD {
  83.     Bitset<size> data;
  84.     std::vector<int> gcnt, gset;
  85.     SD() : data(), gcnt(size / gsize, 0), gset(size / gsize, -1) { }
  86.     void clear() {
  87.         data.clear();
  88.         std::fill(all(gcnt), 0);
  89.         std::fill(all(gset),-1);
  90.     }
  91.     void push(int g) {
  92.         if (gset[g] == -1) return;
  93.         int v = gset[g];
  94.         gset[g] = -1;
  95.         const int begin = g * gsize;
  96.         const int after = (begin + gsize);
  97.         data.set(begin, after-1, v);
  98.         gcnt[g] = gsize * v;
  99.     }
  100.     void set(int p, int v) {
  101.         push(p / gsize);
  102.         gcnt[p / gsize] += v - data.get(p);
  103.         data.set(p, v);
  104.        
  105.     }
  106.     template<typename T>
  107.     void build(const std::vector<T>& arr) {
  108.         for (int i = 0; i < (int)arr.size(); i++) {
  109.             set(i, arr[i]);
  110.         }
  111.     }
  112.     void set(int l, int r, int v) {
  113.         const int gl = l / gsize, gr = r / gsize;
  114.         push(gl); push(gr);
  115.         if (gl == gr) {
  116.             int delta = 0;
  117.             gcnt[gl] += data.set(l, r, v, delta);
  118.         } else {
  119.             int dl = 0, dr = 0;
  120.             const int after = (gl + 1) * gsize, begin = gr * gsize;
  121.             gcnt[gl] += data.set(l, after-1, v, dl);
  122.             gcnt[gr] += data.set(begin, r, v, dr);
  123.             for (int g = gl+1; g < gr; g++) {
  124.                 gset[g] = v;
  125.                 gcnt[g] = v * gsize;
  126.             }
  127.         }
  128.     }
  129.     int get(int l, int r) {
  130.         const int gl = l / gsize, gr = r / gsize;
  131.         push(gl); push(gr);
  132.         int answ = 0;
  133.         if (gl == gr) {
  134.             answ += data.get(l,r);
  135.         } else {
  136.             const int after = (gl + 1) * gsize, begin = gr * gsize;
  137.             answ += data.get(l, after-1) + data.get(begin, r);
  138.             for (int g = gl+1; g < gr; g++) { answ += gcnt[g]; }
  139.         }
  140.         return answ;
  141.     }
  142. };
  143. const int mod = (int)1e9+7;
  144. int pow(int a, int n) {
  145.     int r = 1;
  146.     while (n > 0) {
  147.         if (n % 2) {
  148.             r = int(1LL * a * r % mod);
  149.         }
  150.         a = int(1LL * a * a % mod);
  151.         n /= 2;
  152.     }
  153.     return r;
  154. }
  155. const int NMAX = 1024 * 1024;
  156. int fact[NMAX+1], ifact[NMAX+1];
  157. std::vector<SD<128 * 1024, 1024>> sd(26);
  158. int main() {
  159.     fact[0] = 1;
  160.     for (int i = 1; i <= NMAX; i++) {
  161.         fact[i] = int(1LL * fact[i-1] * i % mod);
  162.     }
  163.     ifact[NMAX] = pow(fact[NMAX], mod-2);
  164.     for (int i = NMAX-1; i >= 0; --i) {
  165.         ifact[i] = int(1LL * ifact[i+1] * (i+1) % mod);
  166.     }
  167.     std::ios_base::sync_with_stdio(false);
  168.     std::cin.tie(0);
  169.     int n; std::cin >> n;
  170.     std::string s; std::cin >> s;
  171.     std::vector<int> arr(n);
  172.     for (char c = 'a'; c <= 'z'; c++) {
  173.         for (int i = 0; i < n; i++) {
  174.             arr[i] = (s[i] == c);
  175.         }
  176.         sd[c-'a'].build(arr);
  177.     }
  178.     int q; std::cin >> q;
  179.     for (int id = 0; id < q; id++) {
  180.         std::cin >> s;
  181.         int l, r; std::cin >> l >> r;
  182.         l--,r--;
  183.         if (s == "get") {
  184.             int answ = fact[r-l+1];
  185.             for (int i = 0; i < 26; i++) {
  186.                 assert(l <= r);
  187.                 auto tmp = sd[i].get(l,r);
  188.                 assert(tmp >= 0);
  189.                 answ = int(1LL * answ * ifact[tmp] % mod);
  190.             }
  191.             std::cout << answ << std::endl;
  192.         } else {
  193.             char curr; std::cin >> curr;
  194.             int j = curr - 'a';
  195.             for (int i = 0; i < j; i++) {
  196.                 sd[i].set(l,r,0);
  197.             }
  198.             sd[j].set(l,r,1);
  199.             for (int i = j+1; i < 26; i++) {
  200.                 sd[i].set(l,r,0);
  201.             }
  202.         }
  203.     }
  204.     return 0;
  205. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement