Pagini recente » Cod sursa (job #1969333) | Cod sursa (job #2118592) | Cod sursa (job #238256) | Cod sursa (job #1251002) | Cod sursa (job #3242407)
#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); // lps[i] = longest prefix of pattern that is a proper suffix of pattern[0:i]
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; // length of current match
for (int i = 0; i < (int)text.size(); i++)
{
while (current_pref > 0 && text[i] != pattern[current_pref])
current_pref = lps[current_pref - 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;
}