Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const long long base = 239017;
- const long long mod = 1e9 + 13; // try change
- const int N = 1e5 + 40;
- long long pw[N];
- long long mul(long long a, long long b) {
- return (a * b) % mod;
- }
- long long add(long long a, long long b) {
- long long res = a + b;
- if (res < 0)
- res += mod;
- return res % mod;
- }
- void prec() {
- pw[0] = 1;
- for (int i = 1; i < N; ++i)
- pw[i] = mul(pw[i - 1], base);
- }
- struct Hash {
- vector <long long> imp;
- Hash() {
- }
- long long value() {
- assert(imp.size());
- return imp.back();
- }
- Hash(string s) {
- imp.resize(s.size());
- imp[0] = s[0];
- for (int i = 1; i < imp.size(); ++i) {
- imp[i] = add(mul(imp[i - 1], base), s[i]);
- }
- }
- void init(string s) {
- imp.resize(s.size());
- imp[0] = s[0];
- for (int i = 1; i < imp.size(); ++i) {
- imp[i] = add(mul(imp[i - 1], base), s[i]);
- }
- }
- long long get_pref(int num) {
- if (num < 0)
- return 0;
- return imp[num];
- }
- long long get_seg(int l, int r) {
- return add(get_pref(r), -mul(get_pref(l - 1), pw[r - l + 1]));
- }
- };
- int ans[N];
- struct node {
- long long hash;
- int num, kt;
- node(long long h, int n, int k) {
- hash = h;
- num = n;
- kt = k;
- }
- };
- int main() {
- ios::sync_with_stdio(false);
- cin.tie(0);
- prec();
- fill(ans, ans + N, 1e9);
- string s;
- cin >> s;
- int len = s.size();
- Hash fi(s);
- int n;
- cin >> n;
- map <int, vector<node>> hashes;
- for (int i = 0; i < n; ++i) {
- int k;
- string t;
- cin >> k >> t;
- Hash se(t);
- hashes[t.size()].push_back(node(se.value(), i, k));
- }
- for (auto i : hashes) {
- map <long long, vector<int>> poses;
- for (auto j : i.second) poses[j.hash];
- for (int j = 0; j + i.first - 1 < len; ++j) {
- long long x = fi.get_seg(j, j + i.first - 1);
- if (poses.count(x)) {
- poses[x].push_back(j);
- }
- }
- for (auto j : i.second) {
- for (int r = j.kt - 1, l = 0; r < poses[j.hash].size(); ++r, ++l) {
- ans[j.num] = min(ans[j.num], poses[j.hash][r] + i.first - poses[j.hash][l]);
- }
- }
- }
- for (int i = 0; i < n; ++i) {
- if (ans[i] == 1e9) ans[i] = -1;
- cout << ans[i] << "\n";
- }
- return 0;
- }
- /*
- * int overflow, array bounds
- * special cases (n=1?), set tle
- * do smth instead of nothing and stay organized
- * double troubles
- * same points in geoma
- * in game theory find win cases
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement