Pagini recente » Cod sursa (job #2635507) | Arhiva de probleme | Cod sursa (job #1899910) | Cod sursa (job #2966149) | Cod sursa (job #1965425)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin ("strmatch.in");
ofstream fout ("strmatch.out");
const int maxn = 2e6 + 5;
char A[maxn], B[maxn];
int Pi[maxn], Ans[maxn], nr, n, m;
void Prefix(char Pattern[]) {
int x = 0;
for (int i = 2; i <= n; i++) {
while (x > 0 && Pattern[x + 1] != Pattern[i]) x = Pi[x];
if (Pattern[x + 1] == Pattern[i]) x++;
Pi[i] = x;
}
}
void KMP(char Pattern[], char String[]) {
int x = 0;
for (int i = 1; i <= m; i++) {
while (x > 0 && Pattern[x + 1] != String[i]) x = Pi[x];
if (Pattern[x + 1] == String[i]) x++;
if (x == n) {
Ans[++nr] = i - n;
x = Pi[x];
}
}
fout << nr << "\n";
int lg = min(nr, 1000);
for (int i = 1; i <= lg; i++) {
fout << Ans[i] << " ";
}
fout << "\n";
}
int main () {
ios_base :: sync_with_stdio (false);
fin >> (A + 1) >> (B + 1);
n = strlen(A + 1);
m = strlen(B + 1);
Prefix(A);
KMP(A, B);
fin.close();
fout.close();
return 0;
}