Advertisement
K_Y_M_bl_C

Untitled

Apr 11th, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.16 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> pii;
  7. typedef vector<int> vi;
  8. typedef vector<ll> vll;
  9.  
  10. #define mk make_pair
  11. #define inb push_back
  12. #define outb pop_back
  13. #define all(v) v.begin(), v.end()
  14. #define X first
  15. #define Y second
  16. #define TIME clock()
  17.  
  18. void sosoat()
  19. {
  20. #define TASK "auto"
  21. #ifdef SOSAT
  22.     //
  23. #else
  24.     freopen(TASK".in", "r", stdin), freopen(TASK".out", "w", stdout);
  25. #endif
  26. }
  27.  
  28. const int MAXN = 1e6 + 7;
  29. const ll P = 239017;
  30. const ll HMOD = (ll)2e9 + 33;
  31.  
  32. int w, n;
  33. char s[MAXN];
  34. int p[MAXN];
  35. char cur[MAXN];
  36. vector < vector <int> > h;
  37. map <int, vi> q;
  38.  
  39. inline int getchar(const int &id, const int &c)
  40. {
  41.     if (!c)
  42.         return h[id][c];
  43.     int ans = (h[id][c] - (ll)h[id][c - 1] * P) % HMOD;
  44.     if (ans >= 0)
  45.         return ans;
  46.     return ans + HMOD;
  47. }
  48.  
  49. inline bool cmp(const int &a, const int &b)
  50. {
  51.     int l = -1, r = min((int)h[a - 1].size(), (int)h[b - 1].size());
  52.     while (r - l > 1)
  53.     {
  54.         int m = l + r >> 1;
  55.         if (h[a - 1][m] == h[b - 1][m])
  56.             l = m;
  57.         else
  58.             r = m;
  59.     }
  60.     if (r == min((int)h[a - 1].size(), (int)h[b - 1].size()))
  61.     {
  62.         if (h[a - 1].size() == h[b - 1].size())
  63.             return a < b;
  64.         return h[a - 1].size() < h[b - 1].size();
  65.     }
  66.     return getchar(a - 1, r) < getchar(b - 1, r);
  67. }
  68.  
  69. int main()
  70. {
  71.     //vector < pair <string, int> > q;
  72.     double tstart = TIME;
  73.     sosoat();
  74.     scanf("%d %d", &w, &n);
  75.     p[0] = 1;
  76.     for (int i = 1; i < MAXN; ++i)
  77.     {
  78.         p[i] = ((ll)p[i - 1] * P) % HMOD;
  79.     }
  80.     h.reserve(w);
  81.     h.resize(w);
  82.     for (int i = 0; i < w; ++i)
  83.     {
  84.         scanf("%s", s);
  85.         ll curh = 0;
  86.         int sz = strlen(s);
  87.         h[i].reserve(sz);
  88.         h[i].resize(sz);
  89.         for (int j = 0; j < sz; ++j)
  90.         {
  91.             curh = (curh * P + s[j]) % HMOD;
  92.             q[curh].inb(i + 1);
  93.             h[i][j] = curh;
  94.         }
  95.     }  
  96.     for (int i = 0; i < n; ++i)
  97.     {
  98.         ll curh = 0;
  99.         int x;
  100.         scanf("%d %s", &x, cur);
  101.         --x;
  102.         int sz = strlen(cur);
  103.         for (int i = 0; i < sz; ++i)
  104.         {
  105.             curh = (curh * P + cur[i]) % HMOD;
  106.         }
  107.         sort(all(q[curh]), cmp);
  108.         if (q[curh].size() <= x)
  109.             puts("-1");
  110.         else
  111.             printf("%d\n", q[curh][x]);
  112.     }
  113.     //cerr << "12121212121212";
  114.     //printf("TOTAL TIME: %.10lf", (TIME - tstart) / 1000.0);
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement