Pagini recente » Cod sursa (job #2675788) | Cod sursa (job #2391860) | Cod sursa (job #3287998) | Cod sursa (job #2626290) | Cod sursa (job #3233214)
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
using namespace std;
vector<int> computeLPSArray(const string& pat) {
int M = pat.length();
vector<int> lps(M, 0);
int length = 0;
int i = 1;
while (i < M) {
if (pat[i] == pat[length]) {
length++;
lps[i] = length;
i++;
} else {
if (length != 0) {
length = lps[length - 1];
} else {
lps[i] = 0;
i++;
}
}
}
return lps;
}
vector<int> KMPSearch(const string& pat, const string& txt) {
int M = pat.length();
int N = txt.length();
vector<int> lps = computeLPSArray(pat);
vector<int> result;
int i = 0;
int j = 0;
while (i < N) {
if (pat[j] == txt[i]) {
j++;
i++;
}
if (j == M) {
result.push_back(i - j);
j = lps[j - 1];
} else if (i < N && pat[j] != txt[i]) {
if (j != 0) {
j = lps[j - 1];
} else {
i++;
}
}
}
return result;
}
int main() {
ifstream infile("strmatch.in");
ofstream outfile("strmatch.out");
if (!infile || !outfile) {
cerr << "Error opening file" << endl;
return 1;
}
string A, B;
getline(infile, A);
getline(infile, B);
vector<int> matches = KMPSearch(A, B);
int num_matches = matches.size();
outfile << num_matches << endl;
for (int i = 0; i < min(num_matches, 1000); ++i) {
outfile << matches[i] << " ";
}
outfile << endl;
infile.close();
outfile.close();
return 0;
}