Advertisement
skaram

Untitled

Sep 21st, 2022 (edited)
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.32 KB | None | 0 0
  1. // #pragma GCC optimize("O3")
  2. //#pragma GCC optimize("Ofast")
  3. #include <bits/stdc++.h>
  4. #ifdef Local
  5. #include "debug/debug.h"
  6. #else
  7. #define debug(...)
  8. #endif
  9.  
  10. typedef long long ll;
  11. typedef long double ld;
  12.  
  13. // #define int ll
  14.  
  15. #define vec vector
  16. #define str string
  17. #define all(x) (x).begin(), (x).end()
  18. #define rall(x) (x).rbegin(), (x).rend()
  19. #define rev(x) reverse(x)
  20. #define sz(x) (int)(x).size()
  21. #define pb(x) push_back(x)
  22.  
  23. using namespace std;
  24.  
  25. struct trie {
  26.     static constexpr int MAXN = 100000;
  27.     int tree[MAXN][26]{}, v[MAXN];
  28.     int sz = 1;
  29.  
  30.     trie() {
  31.         fill(v, v + MAXN, -1);
  32.     };
  33.  
  34.     void add(str s, int x) {
  35.         int i = 0;
  36.         for (int c = 0; c < sz(s); c++) {
  37.             int h = s[c] - 'a';
  38.             if (tree[i][h] == 0)
  39.                 tree[i][h] = sz++;
  40.             i = tree[i][h];
  41.         }
  42.         v[i] = x;
  43.     }
  44.  
  45.     int get(str s) {
  46.         int i = 0;
  47.         for (int c = 0; c < sz(s); c++) {
  48.             int h = s[c] - 'a';
  49.             if (tree[i][h] == 0)
  50.                 return -1;
  51.             i = tree[i][h];
  52.         }
  53.         return v[i];
  54.     }
  55.  
  56.     int iq = 0;
  57.  
  58.     int get(char c) {
  59.         int h = c - 'a';
  60.         if (tree[iq][h] == 0)
  61.             return -2;
  62.         iq = tree[iq][h];
  63.         return v[iq];
  64.     }
  65.  
  66.     void res() {
  67.         iq = 0;
  68.     }
  69. };
  70.  
  71. void solve() {
  72.     str s;
  73.     cin >> s;
  74.     int n = sz(s);
  75.     constexpr int c = 350;
  76.     int q;
  77.     cin >> q;
  78.     vec<vec<int> > res(q);
  79.     vec<pair<int, str> > qs(q);
  80.     for (int tt = 0; tt < q; tt++) {
  81.         int k;
  82.         str x;
  83.         cin >> k >> x;
  84.         int m = sz(x);
  85.         if (m >= c) {
  86.             str t = x + '$' + s;
  87.             n += m + 1;
  88.             vec<int> z(n);
  89.             vec<int> v;
  90.             for (int i = 1, l = 0, r = 0; i < n; i++) {
  91.                 if (i <= r)
  92.                     z[i] = min(r - i + 1, z[i - l]);
  93.                 while (i + z[i] < n && t[z[i]] == t[i + z[i]])
  94.                     z[i]++;
  95.                 if (i + z[i] > r)
  96.                     l = i, r = z[i] + i - 1;
  97.                 if (z[i] == m)
  98.                     v.pb(i);
  99.             }
  100.             n -= m + 1;
  101.             res[tt] = v;
  102.         }
  103.         qs[tt] = {k, x};
  104.     }
  105.     trie trie;
  106.     for (int i = 0; i < q; i++) {
  107.         int m = sz(qs[i].second);
  108.         if (m < c) {
  109.             trie.add(qs[i].second, i);
  110.         }
  111.     }
  112.     for (int i = 0; i < n; i++) {
  113.         for (int j = i; j < min(n, i + c + 1); j++) {
  114.             int x = trie.get(s[j]);
  115.             if (x >= 0)
  116.                 res[x].pb(i);
  117.             else if (x == -2)
  118.                 break;
  119.         }
  120.         trie.res();
  121.     }
  122.     for (int i = 0; i < q; i++) {
  123.         int k = qs[i].first;
  124.         vec<int>& v = res[i];
  125.         int m = sz(qs[i].second);
  126.         if (sz(v) >= k) {
  127.             int cur = n;
  128.             for (int l = 0, r = 0; r < sz(v); r++) {
  129.                 if (r - l + 1 < k)
  130.                     continue;
  131.                 cur = min(cur, v[r] - v[l] + m);
  132.                 l++;
  133.             }
  134.             cout << cur << '\n';
  135.         } else
  136.             cout << "-1\n";
  137.     }
  138. }
  139.  
  140. signed main() {
  141.     ios::sync_with_stdio(false);
  142.     cin.tie(nullptr);
  143.  
  144.     int tt = 1;
  145.     //    cin >> tt;
  146.     while (tt-- > 0)
  147.         solve();
  148.  
  149.     return 0;
  150. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement