Pagini recente » Cod sursa (job #2595255) | Cod sursa (job #1187076) | Cod sursa (job #2732945) | Profil diana-t95 | Cod sursa (job #2237879)
#include <bits/stdc++.h>
using namespace std;
// String Hasher
template <int B, int invB, int MOD>
struct Hasher {
int h, pow;
// Constructors
Hasher(): h(0), pow(1) { assert((1LL * B * invB) % MOD == 1); }
Hasher(int ch): h(ch), pow(B) {}
Hasher(int _h, int _pow): h(_h), pow(_pow) {}
// Pushes
void push_back(int ch) { (*this) = (*this) + Hasher(ch); }
void push_front(int ch) { (*this) = Hasher(ch) + (*this); }
// Pops
void pop_back(int ch) {
pow = (1LL * pow * invB) % MOD;
h = (h - ch) % MOD;
if (h < 0) h += MOD;
}
void pop_front(int ch) {
pow = (1LL * pow * invB) % MOD;
h = (h - 1LL * pow * ch) % MOD;
if (h < 0) h += MOD;
}
// Concatenation
friend Hasher operator+(const Hasher &a, const Hasher &b) { return Hasher((1LL * a.h * b.pow + b.h) % MOD, (1LL * a.pow * b.pow) % MOD); }
// Comparison
friend bool operator==(const Hasher &a, const Hasher &b) { return make_pair(a.h, a.pow) == make_pair(b.h, b.pow); }
};
typedef Hasher <263, 836501907, 1000000000 + 7> H1;
//typedef Hasher <277, 494584842, 1000000000 + 9> H2;
int main() {
ifstream cin("strmatch.in");
ofstream cout("strmatch.out");
string pattern, str;
cin >> pattern >> str;
H1 h_pat1, h1;
//H2 h_pat2, h2;
h1 = h_pat1;
for (auto it: pattern) {
h_pat1.push_back(it);
//h_pat2.push_back(it);
}
vector <int> ans;
for (int i = 0; i < str.size(); ++ i) {
h1.push_back(str[i]);
//h2.push_back(str[i]);
if (i >= pattern.size() - 1) {
if (h1 == h_pat1)// && h2 == h_pat2)
ans.push_back(i - pattern.size() + 1);
h1.pop_front(str[i - pattern.size() + 1]);
//h2.pop_front(str[i - pattern.size() + 1]);
}
}
cout << ans.size() << '\n';
if (ans.size() > 1000)
ans.resize(1000);
for (int i = 0; i < ans.size(); ++ i)
cout << ans[i] << " \n"[i + 1 == ans.size()];
return 0;
}