Pagini recente » Cod sursa (job #1883360) | Cod sursa (job #2107770) | Cod sursa (job #1214684) | Cod sursa (job #774930) | Cod sursa (job #1269327)
#include <fstream>
#include <iostream>
using namespace std;
string p, t;
int urm[2000001], s[1001], pl, tl, i, j, ns;
ifstream fin("kmp.in");
ofstream fout("kmp.out");
/*
void prefix() {
int i, q = 0;
for (i = 2, pi[1] = 0; i <= M; ++i) {
while (q && p[q + 1] != p[i])
q = pi[q];
if (p[q + 1] == p[i])
++q;
pi[i] = q;
}
}
*/
void prefix2() {
int j, X = 0;
urm[0] = 0;
for (j = 1; j <= pl - 1; j++)
if (p[X] == p[j]) { // char match
urm[j] = urm[X];
X = X + 1;
}
else { // char mismatch
urm[j] = X + 1;
X = urm[X];
}
}
int main () {
fin >> p >> t;
//cout << p << '\n' << t;
pl = p.size(); // pattern length
tl = t.size(); // text length
prefix2();
for (i = 0; i <= pl - 1; i++)
cout << urm[i] << ' ';
prefix2();
for (i = 0, j = 0; i < tl; i++) {
if (t[i] == p[j]) // char match
j++;
else // char mismatchs
j = urm[j];
if (j == pl) { // solutie
ns++;
if (ns <= 1000) {
s[ns] = i - pl + 1;
j = 1;
}
}
}
fout << ns << '\n';
for (i = 1; i <= min(ns, 1000); i++)
fout << s[i] << ' ';
}