Pagini recente » Cod sursa (job #3191773) | Cod sursa (job #1526271) | Cod sursa (job #1363743) | Cod sursa (job #714960) | Cod sursa (job #1817968)
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
using namespace std;
ifstream in("strmatch.in");
ofstream out("strmatch.out");
string pattern, text;
vector<int> lps;
vector<int> positions;
int nrFound;
void buildLps()
{
lps[0] = 0;
int i, j;
i = 1;
j = 0;
while (i < pattern.size())
{
if (pattern[i] == pattern[j]) {
lps[i] = j + 1;
i++;
j++;
}
else {
if (j > 0) {
j = lps[j - 1];
}
else {
lps[i] = 0;
i++;
}
}
}
}
void KMPsearch()
{
int i = 0;
int j = 0;
while (i < text.size()) {
if (text[i] == pattern[j]) {
i++;
j++;
}
if (j == pattern.size()) {
if (positions.size() < 1000)
positions.push_back(i - j);
nrFound++;
j = lps[j - 1];
}
else if (i < text.size() && text[i] != pattern[j]) {
if (j != 0) {
j = lps[j - 1];
} else {
i++;
}
}
}
}
int main()
{
getline(in, pattern);
getline(in, text);
lps.resize(pattern.size());
nrFound = 0;
buildLps();
/* for (int i = 0; i < lps.size(); i++) {
cout << lps[i] << " ";
}
cout << "\n";*/
KMPsearch();
out << nrFound << "\n";
for (int i = 0; i < positions.size(); i++) {
out << positions[i] <<" ";
}
return 0;
}