Advertisement
Guest User

KMP

a guest
Apr 10th, 2013
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.27 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <sstream>
  4. #include <string>
  5. #include <vector>
  6. #include <queue>
  7. #include <set>
  8. #include <map>
  9. #include <cstdio>
  10. #include <cstdlib>
  11. #include <cctype>
  12. #include <cmath>
  13. #include <numeric>
  14. using namespace std;
  15.  
  16. int main() {
  17.     for ( ; ; ) {
  18.         if ( cin.peek() == -1 ) break;
  19.         int len;
  20.         cin >> len;
  21.         char *p = new char[len+1];
  22.         int *olap = new int[len+2];
  23.         scanf( "%s", p );
  24.         olap[0] = -1;
  25.         for (int i = 0; p[i] != '\0'; i++) {
  26.             olap[i+1] = olap[i]+1;
  27.             while ( olap[i+1] > 0 && p[i] != p[olap[i+1] - 1] ) {
  28.                 olap[i+1] = olap[olap[i+1] - 1] + 1;
  29.             }
  30.         }
  31.         int j = 0;
  32.         char ch;
  33.         int pos = 0;
  34.         getchar();
  35.         while ( (ch = getchar()) != '\n' ) {
  36.             pos++;
  37.             for (;;) {
  38.                 if ( ch == p[j] ) {
  39.                     j++;
  40.                     if ( j == len ) {
  41.                         cout << pos-len << endl;
  42.                         j = olap[j];
  43.                     }
  44.                     break;
  45.                 } else if (j == 0) break;
  46.                 else j = olap[j];
  47.             }
  48.         }
  49.         delete p;
  50.         delete olap;
  51.     }
  52. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement