Pagini recente » Cod sursa (job #2647890) | Cod sursa (job #2537053) | Cod sursa (job #472784) | Cod sursa (job #2282129) | Cod sursa (job #2043906)
#include <iostream>
#include <string>
#include <stdlib.h>
#include <fstream>
using namespace std;
bool match[2000001];
string s; string pattern;
ifstream fin ("strmatch.in");
ofstream fout ("strmatch.out");
int main()
{
fin >> pattern >> s;
int n = s.size(), m = pattern.size();
int long long hashpattern = 0;
int long long hashs = 0;
int long long firstpow = 1;
int nr = 0;
for (int i=1; i < m; i++) firstpow *= 101, firstpow %= 1999999997;
for (int i=0; i < m; i++) {
hashpattern = (hashpattern * 101 % 1999999997 + pattern[i]) % 1999999997;
}
for (int i=0; i < m; i++) {
hashs = (hashs * 101 % 1999999997 + s[i]) % 1999999997;
}
if (hashs == hashpattern) {
match[1] = 1;
nr++;
}
for (int i=m; i < n; i++) {
hashs = (101 * (hashs - ((int)s[i-m] * firstpow % 1999999997) % 1999999997 + 1999999997) % 1999999997 + s[i]) % 1999999997;
if (hashs == hashpattern) {
match[i-m+1] = 1;
nr++;
}
}
fout << nr << '\n';
int ap = 0;
for (int i=1; i < n && ap < 1000; i++) {
if (match[i]) {
fout << i << ' ';
ap++;
}
}
return 0;
}