Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- typedef pair<int, int> pii;
- typedef vector<int> vi;
- typedef vector<ll> vll;
- #define mk make_pair
- #define inb push_back
- #define outb pop_back
- #define all(v) v.begin(), v.end()
- #define X first
- #define Y second
- #define TIME clock()
- void sosoat()
- {
- #define TASK "auto"
- #ifdef SOSAT
- //
- #else
- freopen(TASK".in", "r", stdin), freopen(TASK".out", "w", stdout);
- #endif
- }
- const int MAXN = 1e6 + 7;
- const ll P = 239017;
- const ll HMOD = (ll)2e9 + 33;
- int w, n;
- char s[MAXN];
- int p[MAXN];
- char cur[MAXN];
- vector < vector <int> > h;
- map <int, vi> q;
- inline int getchar(const int &id, const int &c)
- {
- if (!c)
- return h[id][c];
- int ans = (h[id][c] - (ll)h[id][c - 1] * P) % HMOD;
- if (ans >= 0)
- return ans;
- return ans + HMOD;
- }
- inline bool cmp(const int &a, const int &b)
- {
- int l = -1, r = min((int)h[a - 1].size(), (int)h[b - 1].size());
- while (r - l > 1)
- {
- int m = l + r >> 1;
- if (h[a - 1][m] == h[b - 1][m])
- l = m;
- else
- r = m;
- }
- if (r == min((int)h[a - 1].size(), (int)h[b - 1].size()))
- {
- if (h[a - 1].size() == h[b - 1].size())
- return a < b;
- return h[a - 1].size() < h[b - 1].size();
- }
- return getchar(a - 1, r) < getchar(b - 1, r);
- }
- int main()
- {
- //vector < pair <string, int> > q;
- double tstart = TIME;
- sosoat();
- scanf("%d %d", &w, &n);
- p[0] = 1;
- for (int i = 1; i < MAXN; ++i)
- {
- p[i] = ((ll)p[i - 1] * P) % HMOD;
- }
- h.reserve(w);
- h.resize(w);
- for (int i = 0; i < w; ++i)
- {
- scanf("%s", s);
- ll curh = 0;
- int sz = strlen(s);
- h[i].reserve(sz);
- h[i].resize(sz);
- for (int j = 0; j < sz; ++j)
- {
- curh = (curh * P + s[j]) % HMOD;
- q[curh].inb(i + 1);
- h[i][j] = curh;
- }
- }
- for (int i = 0; i < n; ++i)
- {
- ll curh = 0;
- int x;
- scanf("%d %s", &x, cur);
- --x;
- int sz = strlen(cur);
- for (int i = 0; i < sz; ++i)
- {
- curh = (curh * P + cur[i]) % HMOD;
- }
- sort(all(q[curh]), cmp);
- if (q[curh].size() <= x)
- puts("-1");
- else
- printf("%d\n", q[curh][x]);
- }
- //cerr << "12121212121212";
- //printf("TOTAL TIME: %.10lf", (TIME - tstart) / 1000.0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement