Advertisement
Alex_tz307

KMP

Sep 10th, 2020 (edited)
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.93 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define DIM 2000002
  3.  
  4. using namespace std;
  5.  
  6. ifstream fin ("strmatch.in");
  7. ofstream fout ("strmatch.out");
  8.  
  9. string A, B;
  10. int M, N, PI[DIM], sol[1 << 10], cnt, q;
  11.  
  12. void Make_Prefix () {
  13.   for (int i = 2, q = 0; i <= M; i ++) {
  14.     while (q && A[q + 1] != A[i])
  15.       q = PI[q];
  16.     if (A[q + 1] == A[i])
  17.       q ++;
  18.     PI[i] = q;
  19.   }
  20. }
  21.  
  22. int main () {
  23.   fin >> A >> B;
  24.   M = A.size(), N = B.size();
  25.   for (int i = M; i > 0; i --)
  26.     A[i] = A[i - 1];
  27.   A[0] = ' ';
  28.   for (int i = N; i > 0; i --)
  29.     B[i] = B[i - 1];
  30.   B[0] = ' ';
  31.   Make_Prefix();
  32.   for (int i = 1; i <= N; i ++) {
  33.     while (q && A[q + 1] != B[i])
  34.       q = PI[q];
  35.     if (A[q + 1] == B[i])
  36.       q ++;
  37.     if (q == M) {
  38.       q = PI[M];
  39.       cnt ++;
  40.       if (cnt <= 1000)
  41.         sol[cnt] = i - M;
  42.     }
  43.   }
  44.   fout << cnt << '\n';
  45.   for (int i = 1; i <= min (cnt, 1000); i ++)
  46.     fout << sol[i] << ' ';
  47.   return 0;
  48. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement