Pagini recente » Cod sursa (job #320764) | Cod sursa (job #1679736) | Cod sursa (job #483342) | Cod sursa (job #454162) | Cod sursa (job #1726538)
#include <fstream>
#include <string>
#include <vector>
using namespace std;
vector<int> buildKMP(string pattern)
{
vector<int> kmp;
kmp.resize(pattern.length());
int i = 0, j = 1;
kmp[0] = 0;
while (j < pattern.length())
{
if (pattern[i] == pattern[j])
kmp[j++] = ++i;
else
{
if (i > 0)
{
i = kmp[i - 1];
}
else
{
kmp[j++] = 0;
}
}
}
return kmp;
}
int main()
{
ifstream f("strmatch.in");
ofstream g("strmatch.out");
string pattern, text;
f >> pattern >> text;
vector<int> matches;
auto kmp = buildKMP(pattern);
int i = 0; //pattern
int j = 0; //text
while (j < text.length())
{
if (pattern[i] == text[j])
{
i++; j++;
}
if (i == pattern.length()) //matched whole pattern
{
matches.push_back(j - i);
i = kmp[i - 1];
}
else if (pattern[i] != text[j])
{
if (i > 0)
{
i = kmp[i - 1];
}
else
{
j++;
}
}
}
g << matches.size() << "\n";
for (vector<int>::iterator it = matches.begin(); it != matches.end(); it++)
{
g << *it << " ";
}
return 0;
}