Pagini recente » Cod sursa (job #2955116) | Cod sursa (job #2811004) | Cod sursa (job #2656771) | Cod sursa (job #1101165) | Cod sursa (job #2176254)
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
int i,j,tab[2000010],idx,lp,lt;
char text[2000010],patern[2000010];
vector<int> lst;
void repere_in_patern()
{
idx=0;
i=1;
while(i<lp)
{
if(patern[i]==patern[idx])
{
++idx;
tab[i]=idx;
++i;
}
else
{
if(idx!=0)
{
idx=tab[idx-1];
}
else
{
tab[i]=0;
++i;
}
}
}
}
void KMP()
{
i=0;
j=0;
while(i<lt)
{
if(text[i]==patern[j])
{
++i;
++j;
}
if(j==lp)
{
lst.push_back(i-j);
//++nr;
j=tab[j-1];
}
else if(i<lt && text[i]!=patern[j])
{
if(j!=0)
j=tab[j-1];
else
++i;
}
}
}
int main()
{
fin>>patern>>text;
lt=strlen(text);
lp=strlen(patern);
repere_in_patern();
KMP();
idx=lst.size();
idx=min(idx,1000);
fout<<lst.size()<<"\n";
for(i=0;i<idx;++i)
fout<<lst[i]<<" ";
return 0;
}