Pagini recente » Cod sursa (job #170633) | Cod sursa (job #2091195)
#include <iostream>
#include <string.h>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
#define lim 2000010
char text[lim], pattern[lim];
int pf[lim],n,m,c;
vector <int> sol;
void prefix_function()
{
int k;
for (int i=2; i<=n; i++)
{
k=pf[i-1];
while (k && pattern[i]!=pattern[k+1]) k=pf[k];
if (pattern[i] == pattern[k+1]) k++;
pf[i]=k;
}
}
int main()
{
fin>>(pattern+1)>>(text+1);
n = strlen (pattern+1);
m = strlen (text+1);
prefix_function ();
int k=0;
for (int i=1; i<=m; i++)
{
while (k && pattern[k+1]!=text[i]) k=pf[k];
if (pattern[k+1]==text[i]) k++;
if (k==n)
sol.emplace_back (i-k);
}
int nr=0;
fout<<sol.size()<<'\n';
for (auto it:sol)
{
fout<<it<<' ';
if (++nr==1000)
break;
}
return 0;
}