kmp.cpp 386 B

123456789101112131415161718192021
  1. #include <iostream>
  2. using namespace std;
  3. void kmp(string s, int *l) {
  4. l[1] = 0;
  5. for(int i = 2 ; i <= s.length() ; i++) {
  6. int k = i - 1;
  7. while(s[l[k]] != s[i - 1] && k > 0)
  8. k = l[k];
  9. l[i] = (s[l[k]] == s[i - 1]) ? l[k] + 1 : 0;
  10. }
  11. }
  12. int main() {
  13. string s;
  14. cin >> s;
  15. int l[100];
  16. kmp(s, l);
  17. copy(l, l + s.length() + 1, ostream_iterator<int>(cout, " "));
  18. cout << endl;
  19. }