CJamie

kmp

May 12th, 2022
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.09 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. void kmp(const string &pattern, const string &word)
  5. {
  6. int m = pattern.size();
  7. vector<int> border(m + 1);
  8. border[0] = -1;
  9. for (int i = 0; i < m; ++i)
  10. {
  11. border[i + 1] = border[i];
  12. while (border[i + 1] > -1 and pattern[border[i + 1]] != pattern[i])
  13. {
  14. border[i + 1] = border[border[i + 1]];
  15. }
  16. border[i + 1]++;
  17. }
  18.  
  19. // cout << "pi/lps table for pattern: "
  20. // << pattern << "\n";
  21. // for (int i : border)
  22. // cout << i << " ";
  23.  
  24. int n = word.size();
  25. int seen = 0;
  26. for (int i = 0; i < n; ++i)
  27. {
  28. while (seen > -1 and pattern[seen] != word[i])
  29. {
  30. seen = border[seen];
  31. }
  32. if (++seen == m)
  33. {
  34. cout << "\nfound at: " << (i - m + 1);
  35. seen = border[m];
  36. }
  37. }
  38. // if (!seen)
  39. // cout << "\nnot found";
  40. }
  41.  
  42. int main()
  43. {
  44.  
  45. string word = "WELCOME TO THAPAR";
  46. string pattern = "THAPAR";
  47. kmp(pattern, word);
  48.  
  49. return 0;
  50. }
  51.  
Advertisement
Add Comment
Please, Sign In to add comment