Pagini recente » Cod sursa (job #2492650) | Cod sursa (job #1912251) | Cod sursa (job #2815986) | Cod sursa (job #1359626) | Cod sursa (job #2761193)
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
vector<int> kmp_table(const string &W)
{
size_t N = W.size();
vector<int> T(N + 1);
int pos = 1, cnd = 0;
T[0] = -1;
while (pos < N) {
if (W[pos] == W[cnd]) {
T[pos] = T[cnd];
} else {
T[pos] = cnd;
while (cnd >= 0 && W[pos] != W[cnd]) {
cnd = T[cnd];
}
}
pos++; cnd++;
}
T[pos] = cnd;
return T;
}
vector<int> kmp_search(const string &S, const string &W) {
int j = 0, k = 0;
const vector<int> T = kmp_table(W);
vector<int> P;
while (j < S.size()) {
if (W[k] == S[j]) {
j++; k++;
if (k == W.size()) {
P.push_back(j - k);
k = T[k];
}
} else {
k = T[k];
if (k < 0) {
j++; k++;
}
}
}
return P;
}
int main(int argc, char const *argv[])
{
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
string A, B;
fin >> A >> B;
cout << A << '\n' << B << endl;
const vector<int> P = kmp_search(B, A);
fout << P.size() << '\n';
for (size_t i = 0; i < 1000 && i < P.size(); i++) {
fout << P[i] << ' ';
}
return 0;
}