Guest User

Untitled

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