Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // #pragma GCC optimize("O3")
- //#pragma GCC optimize("Ofast")
- #include <bits/stdc++.h>
- #ifdef Local
- #include "debug/debug.h"
- #else
- #define debug(...)
- #endif
- typedef long long ll;
- typedef long double ld;
- // #define int ll
- #define vec vector
- #define str string
- #define all(x) (x).begin(), (x).end()
- #define rall(x) (x).rbegin(), (x).rend()
- #define rev(x) reverse(x)
- #define sz(x) (int)(x).size()
- #define pb(x) push_back(x)
- using namespace std;
- struct trie {
- static constexpr int MAXN = 100000;
- int tree[MAXN][26]{}, v[MAXN];
- int sz = 1;
- trie() {
- fill(v, v + MAXN, -1);
- };
- void add(str s, int x) {
- int i = 0;
- for (int c = 0; c < sz(s); c++) {
- int h = s[c] - 'a';
- if (tree[i][h] == 0)
- tree[i][h] = sz++;
- i = tree[i][h];
- }
- v[i] = x;
- }
- int get(str s) {
- int i = 0;
- for (int c = 0; c < sz(s); c++) {
- int h = s[c] - 'a';
- if (tree[i][h] == 0)
- return -1;
- i = tree[i][h];
- }
- return v[i];
- }
- int iq = 0;
- int get(char c) {
- int h = c - 'a';
- if (tree[iq][h] == 0)
- return -2;
- iq = tree[iq][h];
- return v[iq];
- }
- void res() {
- iq = 0;
- }
- };
- void solve() {
- str s;
- cin >> s;
- int n = sz(s);
- constexpr int c = 350;
- int q;
- cin >> q;
- vec<vec<int> > res(q);
- vec<pair<int, str> > qs(q);
- for (int tt = 0; tt < q; tt++) {
- int k;
- str x;
- cin >> k >> x;
- int m = sz(x);
- if (m >= c) {
- str t = x + '$' + s;
- n += m + 1;
- vec<int> z(n);
- vec<int> v;
- for (int i = 1, l = 0, r = 0; i < n; i++) {
- if (i <= r)
- z[i] = min(r - i + 1, z[i - l]);
- while (i + z[i] < n && t[z[i]] == t[i + z[i]])
- z[i]++;
- if (i + z[i] > r)
- l = i, r = z[i] + i - 1;
- if (z[i] == m)
- v.pb(i);
- }
- n -= m + 1;
- res[tt] = v;
- }
- qs[tt] = {k, x};
- }
- trie trie;
- for (int i = 0; i < q; i++) {
- int m = sz(qs[i].second);
- if (m < c) {
- trie.add(qs[i].second, i);
- }
- }
- for (int i = 0; i < n; i++) {
- for (int j = i; j < min(n, i + c + 1); j++) {
- int x = trie.get(s[j]);
- if (x >= 0)
- res[x].pb(i);
- else if (x == -2)
- break;
- }
- trie.res();
- }
- for (int i = 0; i < q; i++) {
- int k = qs[i].first;
- vec<int>& v = res[i];
- int m = sz(qs[i].second);
- if (sz(v) >= k) {
- int cur = n;
- for (int l = 0, r = 0; r < sz(v); r++) {
- if (r - l + 1 < k)
- continue;
- cur = min(cur, v[r] - v[l] + m);
- l++;
- }
- cout << cur << '\n';
- } else
- cout << "-1\n";
- }
- }
- signed main() {
- ios::sync_with_stdio(false);
- cin.tie(nullptr);
- int tt = 1;
- // cin >> tt;
- while (tt-- > 0)
- solve();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement