Guest User

Untitled

a guest
Apr 22nd, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.54 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 = 262773725;
  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. for(int i = 0 ; i < (int)words.size() ; i++){
  30. for(int j = 0 ; j < wlen ; j++){
  31. hwords[i] += apow[j] * words[i][j];
  32. hwords[i] %= MOD;
  33. }
  34. //printf("h[%d] = %lld\n", i, hwords[i]);
  35. key *= hwords[i];
  36. key %= MOD;
  37. }
  38. //printf("key = %lld\n", key);
  39. for(int i = 0 ; i < wlen ; i++){
  40. hs[0] += apow[i] * s[i];
  41. hs[0] %= MOD;
  42. }
  43. //printf("s[0] = %lld\n", hs[0]);
  44. for(int i = 1 ; i <= slen - wlen ; i++){
  45. hs[i] = (hs[i - 1] - s[i - 1]) * invA + apow[wlen - 1] * s[i + wlen - 1];
  46. hs[i] = (hs[i] % MOD + MOD) % MOD;
  47. //printf("s[%d] = %lld\n", i, hs[i]);
  48. }
  49. vector<int> ans;
  50. for(int i = 0 ; i < wlen ; i++){
  51. int j = i;
  52. ll nkey = 1;
  53. while(j < wnum * wlen)
  54. nkey *= hs[j], nkey %= MOD, j += wlen;
  55. while(j < slen){
  56. //printf("%d %lld\n", j, nkey);
  57. if(nkey == key)
  58. ans.push_back(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. //printf("%d %lld\n", j, nkey);
  66. if(nkey == key)
  67. ans.push_back(j - wnum * wlen);
  68. }
  69. return ans;
  70. }
  71. };
  72.  
  73. int main(){
  74. Solution sol;
  75. string s = "barfoothefoobarman";
  76. vector<string> words = {"bar", "foo"};
  77. //s = "abaababbaba";
  78. //words = {"ab","ba","ab","ba"};
  79. //s = "abaababbaba";
  80. //words = {"ab","ba","ab","ba"};
  81. auto ans = sol.findSubstring(s, words);
  82. for(int x : ans)
  83. printf("%d\n", x);
  84. return 0;
  85. }
Add Comment
Please, Sign In to add comment