kmp.cpp 558 B

1234567891011121314151617181920212223242526
  1. void kmp_pre(char x[], int m, int pnext[]) {
  2. int i,j;
  3. j=pnext[0]=-1;
  4. i=0;
  5. while (i<m) {
  6. while (-1!=j && x[i]!=x[j]) j=pnext[j];
  7. pnext[++i]=++j;
  8. }
  9. }
  10. // x pattern, y text
  11. // answer: first index (starting with 0)
  12. // KMP_Count : # occurences
  13. int pnext[100005];
  14. int KMP(char x[], int m, char y[], int n) { // KMP_Count
  15. int i,j; // int ans = 0;
  16. kmp_pre(x,m,pnext);
  17. i=j=0;
  18. while(i<n) {
  19. while(-1!=j && y[i]!=x[j]) j=pnext[j];
  20. i++; j++;
  21. if (j>=m) {
  22. return i-m; // ans++; j=pnext[j];
  23. }
  24. }
  25. return -1; // return ans;
  26. }