Pagini recente » Cod sursa (job #2606304) | Cod sursa (job #2964623) | Cod sursa (job #225687) | Cod sursa (job #3222773) | Cod sursa (job #3242405)
#include <fstream>
#include <string>
#include <vector>
std::vector<int> kmp(const std::string& pattern, const std::string& text) {
std::vector<int> lps(pattern.size(), 0);
int current_lps = 0;
for (int i = 1; i < (int)pattern.size(); i++) {
while (current_lps > 0 && pattern[i] != pattern[current_lps])
current_lps = lps[current_lps - 1];
if (pattern[i] == pattern[current_lps]) current_lps++;
lps[i] = current_lps;
}
std::vector<int> appearances;
int current_pref = 0;
for (int i = 0; i < (int)text.size(); i++) {
while (current_pref > 0 && text[i] != pattern[current_pref])
current_pref = lps[current_lps - 1];
if (text[i] == pattern[current_pref]) current_pref++;
if (current_pref == (int)pattern.size()) {
appearances.push_back(i - (int)pattern.size() + 1);
current_pref = lps[current_pref - 1];
}
}
return appearances;
}
int main() {
std::ifstream cin("strmatch.in");
std::ofstream cout("strmatch.out");
std::string pattern, text;
cin >> pattern >> text;
std::vector<int> appearances = kmp(pattern, text);
cout << appearances.size() << '\n';
for (int i = 0; i < std::min(1000, (int)appearances.size()); i++)
cout << appearances[i] << ' ';
return 0;
}