Pagini recente » Cod sursa (job #521635) | Cod sursa (job #2316653) | Cod sursa (job #1490816) | Cod sursa (job #1039760) | Cod sursa (job #2848123)
#include <fstream>
#include <vector>
using namespace std;
ifstream f("strmatch.in");
ofstream g("strmatch.out");
string text, pattern;
int* prefixFunction(const string& s)
{
int* p = new int[s.size()];
p[0] = 0;
int k = 0;
for (int i = 1; i < s.size(); i++)
{
while (k > 0 && s[i] != s[k])
k = p[k - 1];
if (s[i] == s[k])
k++;
p[i] = k;
}
return p;
}
vector < int > KMP(const string& text, const string& pattern)
{
vector < int > ans;
int* p = prefixFunction(pattern);
int k = 0;
for (int i = 1; i < text.size(); i++)
{
while (k > 0 && text[i] != pattern[k])
k = p[k - 1];
if (text[i] == pattern[k])
k++;
if (k == pattern.size())
{
ans.push_back(i - k + 1);
k = p[k - 1];
}
}
delete[] p;
return ans;
}
int main()
{
f >> pattern >> text;
vector < int > ans = KMP(text, pattern);
g << ans.size() << "\n";
for (int i = 0; i < ans.size() && i < 1000; i++)
g << ans[i] << " ";
return 0;
}