#include #include #include std::vector compute_prefix_function(const std::string &pattern) { const int m = pattern.size(); std::vector pi(m); pi[0] = 0; int k = 0; for (int q = 1; q < m; q++) { while (k > 0 && pattern[k] != pattern[q]) { k = pi[k - 1]; } if (pattern[k] == pattern[q]) { k++; } pi[q] = k; } return pi; } void kmp_matcher(const std::string &text, const std::string &pattern) { const int n = text.size(); const int m = pattern.size(); auto pi = compute_prefix_function(pattern); int q = 0; for (int i = 0; i < n; i++) { while (q > 0 && pattern[q] != text[i]) { q = pi[q - 1]; } if (pattern[q] == text[i]) { q++; } if (q == m) { std::cout << i - m + 1 << std::endl; q = pi[q]; } } } int main(void) { std::string text, pattern; std::cin >> text >> pattern; kmp_matcher(text, pattern); return 0; }