#include #include #include // 0 <= a mod n <= n - 1 int mod(const int a, const int n) { if (a > 0) return a % n; return (a % n + n) % n; } // a^b mod n int pow_mod(int a, int b, int n) { int d = 1; a = mod(a, n); while (b > 0) { if (b & 1) { d = mod(d * a, n); } b >>= 1; a = mod(a * a, n); } return d; } void rabin_karp(const std::string &text, const std::string &pattern, const int d, const int q) { const int n = text.size(); const int m = pattern.size(); const int h = pow_mod(d, m - 1, q); int p = 0; std::vector t (n - m, 0); // preprocesiranje for (int i = 0; i < m; i++) { p = mod(d * p + pattern[i], q); t[0] = mod(d * t[0] + text[i], q); } // uparivanje for (int s = 0; s < n - m + 1; s++) { if (t[s] == p) { // da li je text[s..s+m-1]=pattern[0..m-1]? for (int i = 0; i < m; i++) { if (text[s + i] != pattern[i]) { break; } if (i == m - 1) { std::cout << s << std::endl; } } } if (s < n - m) { t[s+1] = mod(d * (t[s] - h * text[s]) + text[s + m], q); } } } int main(void) { std::string text, pattern; std::cin >> text >> pattern; rabin_karp(text, pattern, 127, 251); return 0; }