Pagini recente » Cod sursa (job #2021215) | Cod sursa (job #2746649) | Cod sursa (job #1339124) | Cod sursa (job #788332) | Cod sursa (job #2976771)
#include <bits/stdc++.h>
#define MAXSZ 2000005
using namespace std;
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
int n, m, lps[MAXSZ];
char a[MAXSZ + 1], b[MAXSZ + 1];
int main() {
fin.getline(a, MAXSZ);
fin.getline(b, MAXSZ);
n = (int) strlen(a);
m = (int) strlen(b);
for (int i = n; i > 0; i--)
a[i] = a[i - 1];
a[0] = ' ';
for (int i = m; i > 0; i--)
b[i] = b[i - 1];
b[0] = ' ';
int q = 0;
for (int i = 2; i <= n; i++) {
while (q > 0 && a[q + 1] != a[i])
q = lps[q];
if (a[q + 1] == a[i])
q++;
lps[i] = q;
}
vector<int> matches;
q = 0;
for (int i = 1; i <= m; i++) {
while (q > 0 && a[q + 1] != b[i])
q = lps[q];
if (a[q + 1] == b[i])
q++;
if (q == n) {
matches.push_back(i - n);
q = lps[q];
}
}
fout << matches.size() << '\n';
for (int i = 0; i < min((int) matches.size(), 1000); i++)
fout << matches[i] << ' ';
return 0;
}