ivnikkk

Untitled

Jan 25th, 2022
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.34 KB | None | 0 0
  1. #pragma GCC optimize("03")
  2. #define _CRT_SECURE_NO_WARNINGS
  3. #include "bits/stdc++.h"
  4. using namespace std;
  5. using namespace chrono;
  6. #define all(a) a.begin(), a.end()
  7. #define allr(a) a.rbegin(), a.rend()
  8. #define endl "\n"
  9. #define fast_io ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
  10. mt19937 rnd(std::chrono::high_resolution_clock::now().time_since_epoch().count());
  11. typedef long long ll;
  12. typedef long double ld;
  13.  
  14. string p;
  15. struct Node {
  16.     ll go[26], cur = 0, terminal = 0, binup[21], dp = 0, siz = 0, down[26];
  17. };
  18.  
  19. vector<Node> trie(1);
  20. void add(string& s) {
  21.     ll cur_v = 0;
  22.     for (ll i = 0; i < (ll)s.size(); i++) {
  23.         char level = s[i] - 'a';
  24.         if (trie[cur_v].go[level] == 0) {
  25.             trie.push_back(Node());
  26.             trie[cur_v].go[level] = (ll)trie.size() - 1;
  27.             trie[trie[cur_v].go[level]].cur = trie[cur_v].cur + 1;
  28.         }
  29.         cur_v = trie[cur_v].go[level];
  30.     }
  31.     trie[cur_v].terminal++;
  32.     return;
  33. }
  34. void dfs(ll v = 0, ll p = 0) {
  35.     trie[v].binup[0] = p;
  36.     for (ll i = 0; i + 1 < 21; i++)
  37.         trie[v].binup[i + 1] = trie[trie[v].binup[i]].binup[i];\
  38.     trie[v].dp += trie[p].dp + trie[v].terminal;
  39.     trie[v].siz = trie[v].terminal;
  40.     ll now_sum = 0;
  41.     for (ll c = 0; c < 26; c++) {
  42.         if (trie[v].go[c] != 0) {
  43.             trie[trie[v].go[c]].dp += now_sum;
  44.             dfs(trie[v].go[c], v);
  45.             trie[v].siz += trie[trie[v].go[c]].siz;
  46.             trie[v].down[c] = trie[trie[v].go[c]].down[c];
  47.             now_sum += trie[trie[v].go[c]].siz;
  48.         }
  49.         else {
  50.             trie[v].down[c] = v;
  51.         }
  52.     }
  53. }
  54.  
  55. ll cur_v = 0, lvl = -1;
  56. ll get() {
  57.     ll ans = trie[cur_v].dp;
  58.     if ((ll)p.size() == trie[cur_v].cur) {
  59.         ans -= trie[cur_v].terminal;
  60.     }
  61.     else {
  62.         for (ll i = 0; i < lvl; i++) {
  63.             if (trie[cur_v].go[i] != 0) {
  64.                 ans += trie[trie[cur_v].go[i]].siz;
  65.             }
  66.         }
  67.     }
  68.     return ans;
  69. }
  70. void need(ll c) {
  71.      cur_v = trie[cur_v].down[c];
  72.     ll to = max(trie[cur_v].cur-(ll)p.size(), (ll)0);
  73.     for (ll i = 20; i >= 0; --i) {
  74.         if (to >> i & 1) {
  75.             cur_v = trie[cur_v].binup[i];
  76.         }
  77.     }
  78.     if (trie[cur_v].cur == (ll)p.size())
  79.         lvl = -1;
  80.     else
  81.         lvl = c;
  82. }
  83. signed main() {
  84. #ifdef _DEBUG
  85.     freopen("input.txt", "r", stdin);
  86.     freopen("output.txt", "w", stdout);
  87. #endif
  88.     srand(time(NULL));
  89.     fast_io;
  90.     ll n;
  91.     cin >> n;
  92.     ll q;
  93.     cin >> q;
  94.     cin >> p;
  95.     for (ll i = 0; i < n; i++) {
  96.         string s;
  97.         cin >> s;
  98.         add(s);
  99.     }
  100.     dfs();
  101.     for (ll i = 0; i < (ll)p.size(); i++) {
  102.         ll level = p[i] - 'a';
  103.         if (trie[cur_v].go[level] == 0) {
  104.             lvl = level;
  105.             break;
  106.         }
  107.         cur_v = trie[cur_v].go[level];
  108.     }
  109.     cout << get() << endl;
  110.     while (q--) {
  111.         ll pos;
  112.         char in;
  113.         cin >> pos >> in;
  114.         --pos;
  115.         ll c = in - 'a';
  116.         if (pos > trie[cur_v].cur) {
  117.         }
  118.         else {
  119.             ll to = trie[cur_v].cur - pos;
  120.             for (ll i = 20; i >= 0; --i) {
  121.                 if (to >> i & 1) {
  122.                     cur_v = trie[cur_v].binup[i];
  123.                 }
  124.             }
  125.             need(c);
  126.         }
  127.         cout << get() << endl;;
  128.     }
  129.  
  130. }
Advertisement
Add Comment
Please, Sign In to add comment