loulett

prefix_function

Nov 14th, 2015
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.75 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4.  
  5. int main() {
  6.     std::string substr, str;
  7.     std::cin >> substr;
  8.     std::cin >> str;
  9.     substr += '#';
  10.     int len = substr.size();
  11.     std::vector<int> prefix(len);
  12.     for (int i = 1; i < len; i++) {
  13.         int k = prefix[i - 1];
  14.         while (k > 0 && substr[i] != substr[k])
  15.         {
  16.             k = prefix[k - 1];
  17.         }
  18.         if (substr[i] == substr[k]) {
  19.             k++;
  20.         }
  21.         prefix[i] = k;
  22.     }
  23.     int k = 0;
  24.     if (str[0] == substr[0]) {
  25.         k = 1;
  26.     }
  27.     if (k == len - 1) {
  28.         std::cout << 0 << ' ';
  29.     }
  30.     for (int i = 1; i < str.size(); i++) {
  31.         while (k > 0 && str[i] != substr[k]) {
  32.             k = prefix[k - 1];
  33.         }
  34.         if (str[i] == substr[k]) {
  35.             k++;
  36.         }
  37.         if (k == len - 1) {
  38.             std::cout << i - len + 2 << ' ';
  39.         }
  40.     }
  41.     return 0;
  42. }
Advertisement
Add Comment
Please, Sign In to add comment