Advertisement
K_Y_M_bl_C

Untitled

Nov 5th, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.91 KB | None | 0 0
  1. const int P = 239017;
  2. const int HMOD = (int)1e9 + 87;
  3.  
  4. int mul(int a, int b)
  5. {
  6.     return ((ll)a * b) % HMOD;
  7. }
  8.  
  9. void solve (char* s, int k, char** a, int q, query_t* qs, ll* ans)
  10. {
  11.     for (int i = 0; i < q; i++)
  12.         ans[i] = 0;
  13.     int n = strlen(s);
  14.     vi p(n + 1);
  15.     p[0] = 1;
  16.     for (int i = 1; i <= n; ++i)
  17.         p[i] = mul(p[i - 1], P);
  18.     vi h(n);
  19.     h[0] = s[0];
  20.     vi sz(k);
  21.     for (int i = 0; i < k; ++i)
  22.         sz[i] = strlen(a[i]);
  23.     for (int i = 1; i < n; ++i)
  24.     {
  25.         h[i] = mul(h[i - 1], P) + s[i];
  26.         if (h[i] >= HMOD)
  27.             h[i] -= HMOD;
  28.     }
  29.     int cntlen = 0;
  30.     set<int> lns;
  31.     for (int i = 0; i < k; ++i)
  32.     {
  33.         lns.insert(sz[i]);
  34.     }
  35.     cntlen = lns.size();
  36.     vi id2len;
  37.     id2len.reserve(cntlen);
  38.     for (int x : lns)
  39.         id2len.inb(x);
  40.     //precalc hashes
  41.     unordered_set<int> cnt[cntlen];
  42.     for (int i = 0; i < k; ++i)
  43.     {
  44.         int clen = sz[i];
  45.         int id = lower_bound(all(id2len), clen) - id2len.begin();
  46.         int ch = 0;
  47.         for (int j = 0; j < clen; ++j)
  48.         {
  49.             ch = mul(ch, P) + a[i][j];
  50.             if (ch >= HMOD)
  51.                 ch -= HMOD;
  52.         }
  53.         cnt[id].insert(ch);
  54.     }
  55.     int pr[cntlen][n];
  56.     //precalced pr sums
  57.     for (int i = 0; i < n; ++i)
  58.     {
  59.         for (int j = 0; j < cntlen; ++j)
  60.         {
  61.             if (i)
  62.                 pr[j][i] = pr[j][i - 1];
  63.             else
  64.                 pr[j][i] = 0;
  65.             if (id2len[j] + i > n)
  66.                 continue;
  67.             int chash = h[i + id2len[j] - 1];
  68.             if (i)
  69.                 chash -= mul(h[i - 1], p[id2len[j]]);
  70.             if (chash < 0)
  71.                 chash += HMOD;
  72.             if (cnt[j].find(chash) != cnt[j].end())
  73.             {
  74.                 pr[j][i]++;
  75.             }
  76.         }
  77.     }
  78.     //zapros odin otvet drugoy
  79.     for (int it = 0; it < q; ++it)
  80.     {
  81.         int l = qs[it].l - 1;
  82.         int r = qs[it].r - 1;
  83.         for (int i = 0; i < cntlen; ++i)
  84.         {
  85.             if (id2len[i] > r - l + 1)
  86.                 continue;
  87.             ans[it] += pr[i][r - id2len[i] + 1];
  88.             if (l)
  89.                 ans[it] -= pr[i][l - 1];
  90.         }
  91.     }
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement