Advertisement
skimono

Untitled

Sep 18th, 2023
807
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.07 KB | None | 0 0
  1. #pragma GCC optimize("Ofast") // ������������ ���������, �� ��� ������
  2. #pragma GCC optimize("no-stack-protector") //�����
  3. #pragma GCC optimize("unroll-loops") // � ���� ���� ��� �� 100 �� ������ ����� � ��������� �� ��� � 100 ��� �� ������ ��������
  4. #pragma GCC target("sse,sse2,sse3,ssse3,popcnt,abm,mmx,tune=native") // ��� ����� ����� �� ��� 03 02 ��������� � ������ ������� �������� ��� ���� ������������
  5. #pragma GCC optimize("fast-math")
  6. #define _CRT_SECURE_NO_WARNINGS
  7.  
  8. #include <iostream>
  9. #include <vector>
  10. #include <string>
  11. #include <algorithm>
  12. #include <cmath>
  13. #include <stack>
  14. #include <iomanip>
  15. #include <fstream>
  16. #include <string>
  17. #include <set>
  18. #include <deque>
  19. #include <queue>
  20. #include <map>
  21. #include <bitset>
  22. #include <random>
  23. #include <list>
  24. #include <unordered_map>
  25. #include <unordered_set>
  26. #include <cassert>
  27.  
  28. using namespace std;
  29.  
  30. typedef long long ll;
  31. typedef short sh;
  32. typedef unsigned long long ull;
  33. typedef long double ld;
  34. typedef string str;
  35. //typedef __int128 ultraint;
  36. #define sqrt sqrtl
  37. #define F first
  38. #define S second
  39. #define endl '\n'
  40. #define all(vc666) vc666.begin(), vc666.end()
  41. #define allr(vc666) vc666.rbegin(), vc666.rend()
  42. #define int long long
  43. #define degug(x) cerr (#x) << " " << (x) << endl;
  44.  
  45. const ll INF = 2e18;
  46. const ll inf = 2e9 + 3;
  47. const ll ONE = 1, ZERO = 0;
  48. const ll mod = 998244353;
  49. const ll m1 = 1e9 + 575179;
  50. const ll m2 = 1e9 + 87;
  51. const ll LG = 19;
  52. const ll k = 10000;
  53. const ll p = 79;
  54. ld EPS = 1e-9;
  55. ld PI = 3.1415926535897932384;
  56. ld phi = (sqrt(5) + 1.0) / 2.0;
  57. mt19937_64 rnd(4906);
  58.  
  59. struct Query {
  60.     int l, r, idx;
  61. };
  62.  
  63. const int N = 1e5 + 3;
  64. pair <ll, ll> pw[N];
  65. pair <ll, ll> h[N];
  66. vector <ll> keys[N];
  67. vector <short> base[N], base2[N];
  68. int ans[N];
  69. Query Q[N];
  70.  
  71. pair <ll, ll> get_h(int l, int r) {
  72.     return { (h[r + 1].first - (h[l].first * pw[r - l + 1].first) % m1 + m1) % m1, (h[r + 1].second - (h[l].second * pw[r - l + 1].second) % m2 + m2) % m2 };
  73. }
  74.  
  75. bool cmp(const Query& a, const Query& b) {
  76.     if (a.l / k != b.l / k) {
  77.         return a.l < b.l;
  78.     }
  79.     else {
  80.         return a.r < b.r;
  81.     }
  82. }
  83.  
  84. void solve() {
  85.     string t, s;
  86.     int n, len_t, len_s, len, i, j, m, l, r, q, res, lst = -1;
  87.     cin >> t;
  88.     len_t = t.size();
  89.     pw[0] = { 1, 1 };
  90.     h[0] = { 0, 0 };
  91.     for (i = 1; i <= len_t; i++) {
  92.         pw[i].first = (pw[i - 1].first * p) % m1;
  93.         pw[i].second = (pw[i - 1].second * p) % m2;
  94.         h[i].first = (h[i - 1].first * p + (t[i - 1] - 'a' + ONE)) % m1;
  95.         h[i].second = (h[i - 1].second * p + (t[i - 1] - 'a' + ONE)) % m2;
  96.     }
  97.     pair <ll, ll> hesh;
  98.     vector <int> rzl;
  99.     cin >> n;
  100.     for (i = 0; i < n; i++) {
  101.         cin >> s;
  102.         base[i].reserve(320);
  103.         base2[i].reserve(320);
  104.         len_s = s.size();
  105.         rzl.push_back(len_s);
  106.         hesh = { 0, 0 };
  107.         for (j = 0; j < len_s; j++) {
  108.             hesh.first = (hesh.first * p + (s[j] - 'a' + ONE)) % m1;
  109.             hesh.second = (hesh.second * p + (s[j] - 'a' + ONE)) % m2;
  110.         }
  111.         keys[len_s].push_back(hesh.first * m1 + hesh.second);
  112.     }
  113.     sort(all(rzl));
  114.     rzl.resize(unique(all(rzl)) - rzl.begin());
  115.     m = rzl.size();
  116.     for (j = 0; j < m; j++) {
  117.         sort(all(keys[rzl[j]]));
  118.     }
  119.     for (i = 0; i < len_t; i++) {
  120.         for (j = 0; j < m; j++) {
  121.             len = rzl[j];
  122.             if (i + len - 1 < len_t) {
  123.                 hesh = get_h(i, i + len - 1);
  124.                 if (binary_search(all(keys[len]), hesh.first * m1 + hesh.second)) {
  125.                     base[i].push_back(len);
  126.                     base2[i + len - 1].push_back(len);
  127.                 }
  128.             }
  129.         }
  130.     }
  131.     for (i = 0; i < len_t; i++) {
  132.         sort(all(base2[i]));
  133.     }
  134.     cin >> q;
  135.     for (i = 0; i < q; i++) {
  136.         cin >> Q[i].l >> Q[i].r;
  137.         Q[i].idx = i;
  138.         Q[i].l--;
  139.         Q[i].r--;
  140.     }
  141.     sort(Q, Q + q, cmp);
  142.     int left, right, last_r, last_l;
  143.     for (i = 0; i < q; i++) {
  144.         if (Q[i].l / k != lst) {
  145.             lst = Q[i].l / k;
  146.             l = Q[i].l;
  147.             r = Q[i].l - 1;
  148.             res = 0;
  149.         }
  150.         last_r = r;
  151.         last_l = l;
  152.         for (r; r < Q[i].r; r++) {
  153.             left = -1, right = base2[r + 1].size();
  154.             while (right - left > 1) {
  155.                 m = (left + right) / 2;
  156.                 if (r + 1 - base2[r + 1][m] + 1 >= last_l) {
  157.                     left = m;
  158.                 }
  159.                 else {
  160.                     right = m;
  161.                 }
  162.             }
  163.             res += right;
  164.         }
  165.         for (l; l > Q[i].l; l--) {
  166.             left = -1, right = base[l - 1].size();
  167.             while (right - left > 1) {
  168.                 m = (left + right) / 2;
  169.                 if (l - 1 + base[l - 1][m] - 1 <= r) {
  170.                     left = m;
  171.                 }
  172.                 else {
  173.                     right = m;
  174.                 }
  175.             }
  176.             res += right;
  177.         }
  178.         for (l; l < Q[i].l; l++) {
  179.             left = -1, right = base[l].size();
  180.             while (right - left > 1) {
  181.                 m = (left + right) / 2;
  182.                 if (l + base[l][m] - 1 <= r) {
  183.                     left = m;
  184.                 }
  185.                 else {
  186.                     right = m;
  187.                 }
  188.             }
  189.             res -= right;
  190.         }
  191.         ans[Q[i].idx] = res;
  192.     }
  193.     for (i = 0; i < q; i++) {
  194.         cout << ans[i] << " ";
  195.     }
  196. }
  197.  
  198. signed main() {
  199. #ifdef _DEBUG
  200.     freopen("input.txt", "r ", stdin);
  201.     freopen("output.txt", "w", stdout);
  202. #endif
  203.     ios_base::sync_with_stdio(0);
  204.     cin.tie(NULL);
  205.     cout.tie(NULL);
  206.     int t = 1;
  207.     //cin >> t;
  208.     while (t--) solve();
  209. }
  210. //Deisgned by skimono
  211. //Клуб "Кольца(Серьги)"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement