Advertisement
_rashed

SPOJ NHAY

Jul 25th, 2022
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.17 KB | None | 0 0
  1. #define ll long long
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. const int OO = 1e9;
  6. const double EPS = 1e-9;
  7.  
  8. vector<int> computePrefixes(string s) {
  9.     vector<int> ret(s.length());
  10.     for(int i = 1, k = 0; i < s.length(); i++) {
  11.         while(k > 0 && s[k] != s[i]) {
  12.             k = ret[k-1];
  13.         }
  14.         if(s[k] == s[i]) {
  15.             ret[i] = ++k;
  16.         }
  17.         else {
  18.             ret[i] = k;
  19.         }
  20.     }
  21.     return ret;
  22. }
  23.  
  24. void kmp(string s, string p) {
  25.     vector<int> pre = computePrefixes(p);
  26.     for(int i = 0, k = 0; i < s.length(); i++) {
  27.         while(k > 0 && s[i] != p[k]) {
  28.             k = pre[k-1];
  29.         }
  30.         if(s[i] == p[k]) {
  31.             k++;
  32.         }
  33.         if(k == p.length()) {
  34.             cout << i+1-p.length() << "\n";
  35.             k = pre[k-1];
  36.         }
  37.     }
  38. }
  39.  
  40. int main()
  41. {
  42.     ios_base::sync_with_stdio(NULL);
  43.     cin.tie(0);
  44.     cout.tie(0);
  45.     int n;
  46.     string p,s;
  47.     bool first = true;
  48.     while(cin >> n >> p >> s) {
  49.         if(first) {
  50.             first = false;
  51.         }
  52.         else {
  53.             cout << "\n";
  54.         }
  55.         kmp(s,p);
  56.     }
  57.  
  58.  
  59.     return 0;
  60. }
  61.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement