Pagini recente » Cod sursa (job #43814) | Cod sursa (job #2950447) | Cod sursa (job #784751) | Cod sursa (job #2436601) | Cod sursa (job #2871344)
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
ifstream in("strmatch.in");
ofstream out("strmatch.out");
vector<int> make_prefix(string pattern)
{
vector<int> prefix(pattern.length(), 0);
int j = 0;
int i = 1;
while (i < pattern.length())
{
if (pattern[i] == pattern[j])
{
prefix[i] = prefix[j] + 1;
i++;
j++;
if (i >= pattern.length())
break;
}
else
{
if (j == 0)
{
prefix[i] = 0;
i++;
}
else
{
j = prefix[i - 1];
}
}
}
return prefix;
}
vector<int> match(string &text, string &pattern)
{
int n = text.length();
int m = pattern.length();
vector<int> result;
vector<int> prefix = make_prefix(pattern);
int i = 0;
int j = 0;
while (i < n)
{
if (text[i] == pattern[j])
{
i++;
j++;
}
if (j >= m)
{
result.push_back(i - m);
j = prefix[j - 1];
}
else if (i < n && text[i] != pattern[j])
{
if (j == 0)
i++;
else
j = prefix[j - 1];
}
}
return result;
}
int main()
{
string s, pattern;
getline(in, pattern);
getline(in, s);
vector<int> r = match(s, pattern);
out << r.size() << endl;
for (int i = 0; i < min(1000, (int)r.size()); i++)
out << r[i] << " ";
return 0;
}