Pagini recente » Cod sursa (job #1710181) | Cod sursa (job #255709) | Cod sursa (job #807082) | Cod sursa (job #2789173) | Cod sursa (job #3001055)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
char s[2000001];
char pat[2000001];
int lps[2000001];
int rez[2000001];
int n, m;
void calc_lps()
{
int len = 0;
lps[0] = 0;
int i = 1;
while(i < m)
{
if(pat[len] == pat[i])
lps[i++] = ++len;
else if(len)
len = lps[len - 1];
else
lps[i++] = 0;
}
}
void kmp()
{
int nr = 0;
int i, j;
for(i = 0, j = 0; n - i >= m - j;)
{
if(s[i] == pat[j])
{
i++;
j++;
}
else if(j == m)
{
rez[nr++] = i;
j = lps[j - 1];
}
else
{
if(j == 0)
i++;
else
j = lps[j - 1];
}
}
fout << nr << '\n';
for(int i = 0; i < nr; ++i)
fout << rez[i] - m << ' ';
}
int main()
{
fin.getline(pat, 2000001);
fin.getline(s, 2000001);
n = strlen(s);
m = strlen(pat);
calc_lps();
kmp();
return 0;
}