Guest User

Untitled

a guest
Apr 22nd, 2018
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.11 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const ll MOD = 1000000009, A = 131, invA = 526717562;
  5. class Solution {
  6. public:
  7. vector<int> findSubstring(string s, vector<string>& words) {
  8. int wlen = words[0].length(), slen = s.length(), wnum = words.size();
  9. vector<ll> apow(wlen, 1);
  10. for(int i = 1 ; i < wlen ; i++)
  11. apow[i] = (apow[i - 1] * A) % MOD;
  12. vector<ll> hwords(words.size()), hs(slen);
  13. ll key = 0;
  14. for(int i = 0 ; i < (int)words.size() ; i++){
  15. for(int j = 0 ; j < wlen ; j++){
  16. hwords[i] += apow[j] * words[i][j];
  17. hwords[i] %= MOD;
  18. }
  19. //printf("h[%d] = %lld\n", i, hwords[i]);
  20. key += hwords[i];
  21. key %= MOD;
  22. }
  23. //printf("key = %lld\n", key);
  24. for(int i = 0 ; i < wlen ; i++){
  25. hs[0] += apow[i] * s[i];
  26. hs[0] %= MOD;
  27. }
  28. //printf("s[0] = %lld\n", hs[0]);
  29. for(int i = 1 ; i <= slen - wlen ; i++){
  30. hs[i] = (hs[i - 1] - s[i - 1]) * invA + apow[wlen - 1] * s[i + wlen - 1];
  31. hs[i] = (hs[i] % MOD + MOD) % MOD;
  32. //printf("s[%d] = %lld\n", i, hs[i]);
  33. }
  34. vector<int> ans;
  35. for(int i = 0 ; i < wlen ; i++){
  36. int j = i;
  37. ll nkey = 0;
  38. while(j < wnum * wlen)
  39. nkey += hs[j], nkey %= MOD, j += wlen;
  40. while(j < slen){
  41. //printf("%d %lld\n", j, nkey);
  42. if(nkey == key)
  43. ans.push_back(j - wnum * wlen);
  44. nkey += hs[j] - hs[j - wnum * wlen];
  45. nkey = (nkey % MOD + MOD) % MOD;
  46. j += wlen;
  47. }
  48. if(nkey == key)
  49. ans.push_back(j - wnum * wlen);
  50. }
  51. return ans;
  52. }
  53. };
  54.  
  55. int main(){
  56. Solution sol;
  57. string s = "barfoothefoobarman";
  58. vector<string> words = {"bar", "foo"};
  59. s = "wordgoodgoodgoodbestword";
  60. words = {"word","good","best","good"};
  61. auto ans = sol.findSubstring(s, words);
  62. for(int x : ans)
  63. printf("%d\n", x);
  64. return 0;
  65. }
Add Comment
Please, Sign In to add comment