Pagini recente » Cod sursa (job #2110329) | Cod sursa (job #2023378) | Cod sursa (job #2030187) | Cod sursa (job #730089) | Cod sursa (job #2339814)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream in("strmatch.in");
ofstream out("strmatch.out");
int n,m,contor;
int lps[2000001],c[2000001];
char a[2000001],b[2000001];
void LPS()
{
int i=1,len=0;
while(i<m)
{
if(b[i]==b[len])
{
++len;
lps[i]=len;
++i;
}
else
{
if(len==0)
++i;
else
len=lps[len-1];
}
}
}
void KMP(int &contor)
{
int i=0,j=0;
while(i<n){
if(a[i]==b[j]){
++i;++j;
if(j==m){
++contor;
c[contor]=i-m;
j=lps[j-1];
}
}
else{
if(j==0)
++i;
else
j=lps[j-1];
}
}
}
int main()
{
in>>b>>a;
n=strlen(a);
m=strlen(b);
if(n<m)
out<<0;
else
{
LPS();
KMP(contor);
for(int i=0;i<m;++i)
cout<<lps[i]<<" ";
out<<contor<<'\n';
for(int i=1;i<=contor;++i)
out<<c[i]<<" ";
}
return 0;
}