#include #include std::vector compute_z(const std::string &str) { int n = str.size(); std::vector z(n); int L = 0; int D = 0; for (int i = 1; i < n; i++) { if (i <= D) { z[i] = std::min(z[i - L], D - i + 1); } while (i + z[i] < n && str[i + z[i]] == str[z[i]]) { z[i]++; } if (i + z[i] - 1 > D) { D = i + z[i] - 1; L = i; } } return z; } void z_string_matcher(const std::string &text, const std::string &pattern) { auto z = compute_z(pattern + "#" + text); for (int i = 0; i < z.size(); i++) { if (z[i] == pattern.size()) { std::cout << i - z[i] - 1 << std::endl; } } } int main(void) { std::string text, pattern; std::cin >> text >> pattern; z_string_matcher(text, pattern); return 0; }