Pagini recente » Cod sursa (job #1622408) | Cod sursa (job #1235677) | Cod sursa (job #2519157) | Cod sursa (job #2701153) | Cod sursa (job #1312969)
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;
ifstream f ("strmatch.in");
ofstream g ("strmatch.out");
const int LMAX = 2000000 + 1;
char sir[LMAX], pattern[LMAX];
int p[LMAX];
vector <int> sol;
void citeste() {
f >> pattern >> sir;
}
void prefix(char *s) {
int l = strlen(s), k = 0;
p[0] = 0;
for (int i = 1; i < l; i++) {
while (k > 0 && s[k] != s[i]) k = p[k - 1];
if (s[k] == s[i]) k++;
p[i] = k;
}
}
int KMP(char *a, char *b) {
prefix(a);
int n = strlen(a);
int m = strlen(b);
int k = 0, aparitii = 0;
for (int i = 0; i < m; i++) {
while (k > 0 && a[k] != b[i]) k = p[k - 1];
if (a[k] == b[i]) k++;
if (k == n) {
aparitii++;
if (aparitii <= 1000) sol.push_back(i - n + 1);
}
}
return aparitii;
}
void scrie() {
for (int i = 0; i < (int)sol.size(); i++) g << sol[i] << ' ';
g << '\n';
}
int main() {
citeste();
g << KMP(pattern, sir) << '\n';
scrie();
}