Advertisement
cincout

Untitled

Oct 4th, 2019
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.76 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const long long base = 239017;
  6. const long long mod = 1e9 + 13; // try change
  7. const int N = 1e5 + 40;
  8.  
  9. long long pw[N];
  10.  
  11. long long mul(long long a, long long b) {
  12. return (a * b) % mod;
  13. }
  14.  
  15. long long add(long long a, long long b) {
  16. long long res = a + b;
  17. if (res < 0)
  18. res += mod;
  19. return res % mod;
  20. }
  21.  
  22. void prec() {
  23. pw[0] = 1;
  24. for (int i = 1; i < N; ++i)
  25. pw[i] = mul(pw[i - 1], base);
  26. }
  27.  
  28. struct Hash {
  29. vector <long long> imp;
  30. Hash() {
  31.  
  32. }
  33. long long value() {
  34. assert(imp.size());
  35. return imp.back();
  36. }
  37. Hash(string s) {
  38. imp.resize(s.size());
  39. imp[0] = s[0];
  40. for (int i = 1; i < imp.size(); ++i) {
  41. imp[i] = add(mul(imp[i - 1], base), s[i]);
  42. }
  43. }
  44. void init(string s) {
  45. imp.resize(s.size());
  46. imp[0] = s[0];
  47. for (int i = 1; i < imp.size(); ++i) {
  48. imp[i] = add(mul(imp[i - 1], base), s[i]);
  49. }
  50. }
  51. long long get_pref(int num) {
  52. if (num < 0)
  53. return 0;
  54. return imp[num];
  55. }
  56. long long get_seg(int l, int r) {
  57. return add(get_pref(r), -mul(get_pref(l - 1), pw[r - l + 1]));
  58. }
  59. };
  60.  
  61. int ans[N];
  62.  
  63. struct node {
  64. long long hash;
  65. int num, kt;
  66. node(long long h, int n, int k) {
  67. hash = h;
  68. num = n;
  69. kt = k;
  70. }
  71. };
  72.  
  73. int main() {
  74. ios::sync_with_stdio(false);
  75. cin.tie(0);
  76. prec();
  77. fill(ans, ans + N, 1e9);
  78. string s;
  79. cin >> s;
  80. int len = s.size();
  81. Hash fi(s);
  82. int n;
  83. cin >> n;
  84. map <int, vector<node>> hashes;
  85. for (int i = 0; i < n; ++i) {
  86. int k;
  87. string t;
  88. cin >> k >> t;
  89. Hash se(t);
  90. hashes[t.size()].push_back(node(se.value(), i, k));
  91. }
  92. for (auto i : hashes) {
  93. map <long long, vector<int>> poses;
  94. for (auto j : i.second) poses[j.hash];
  95. for (int j = 0; j + i.first - 1 < len; ++j) {
  96. long long x = fi.get_seg(j, j + i.first - 1);
  97. if (poses.count(x)) {
  98. poses[x].push_back(j);
  99. }
  100. }
  101. for (auto j : i.second) {
  102. for (int r = j.kt - 1, l = 0; r < poses[j.hash].size(); ++r, ++l) {
  103. ans[j.num] = min(ans[j.num], poses[j.hash][r] + i.first - poses[j.hash][l]);
  104. }
  105. }
  106. }
  107. for (int i = 0; i < n; ++i) {
  108. if (ans[i] == 1e9) ans[i] = -1;
  109. cout << ans[i] << "\n";
  110. }
  111. return 0;
  112. }
  113.  
  114. /*
  115. * int overflow, array bounds
  116. * special cases (n=1?), set tle
  117. * do smth instead of nothing and stay organized
  118. * double troubles
  119. * same points in geoma
  120. * in game theory find win cases
  121. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement