Pagini recente » Cod sursa (job #2710806) | Cod sursa (job #1621068) | Cod sursa (job #1356247) | Cod sursa (job #3215419) | Cod sursa (job #1526265)
#include <fstream>
#include <vector>
#include <string>
std::fstream in, out;
std::string text, pattern;
std::vector<int> pos, nextt;
int n, m;
void leUrmator()
{
int k = -1, x;
nextt[0] = 0;
for (x = 1; x < m; ++x)
{
while (k > 0 && pattern[k + 1] != pattern[x]) k = nextt[x];
if (pattern[k + 1] == pattern[x]) ++k;
nextt[x] = k;
}
}
int main()
{
in.open("strmatch.in", std::fstream::in);
out.open("strmatch.out", std::fstream::out);
int i, x = -1;
in >> pattern >> text;
n = text.size();
m = pattern.size();
nextt.resize(m);
leUrmator();
for (i = 0; i < n; ++i)
{
while (x > 0 && pattern[x + 1] != text[i]) x = nextt[x];
if (pattern[x + 1] == text[i]) ++x;
if (x == m - 1)
{
pos.push_back(i - m + 1);
x = nextt[x];
}
if (pos.size() > 999) break;
}
int vlen = pos.size();
out << vlen << "\n";
for (i = 0; i < vlen && i < 1000; ++i) out << pos[i] << ' ';
return 0;
}