Pagini recente » Cod sursa (job #1375862) | Cod sursa (job #538385) | Cod sursa (job #1977982) | Cod sursa (job #2163619) | Cod sursa (job #2733123)
#include <fstream>
#include <vector>
using namespace std;
ifstream f("strmatch.in");
ofstream g("strmatch.out");
string text, pattern;
int* calcPrefixFunction(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[k] == s[i])
k++;
p[i] = k;
}
return p;
}
vector < int > KMP(const string &text, const string &pattern)
{
vector < int > ans;
int* p = calcPrefixFunction(pattern);
int maxPrefixLenght = 0;
for (int i = 0; i < text.size(); i++)
{
while (maxPrefixLenght > 0 && text[i] != pattern[maxPrefixLenght])
maxPrefixLenght = p[maxPrefixLenght - 1];
if (pattern[maxPrefixLenght] == text[i])
maxPrefixLenght++;
if (maxPrefixLenght == pattern.size())
{
int index = i - pattern.size() + 1;
ans.push_back(index);
maxPrefixLenght = p[maxPrefixLenght - 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;
}