Pagini recente » Cod sursa (job #3281427) | Cod sursa (job #1239498) | Cod sursa (job #2216105) | Cod sursa (job #2126091) | Cod sursa (job #1830890)
#include <iostream>
#include <cstdio>
#include <string.h>
#define cout cerr
#define MAX 2000005
using namespace std;
char a[MAX],b[MAX],n,m;
int suf[MAX],i,j;
int nrn, loc[MAX];
int main()
{
freopen("strmatch.in","r",stdin);
freopen("strmatch.out","w",stdout);
scanf("%s %s",a+1,b+1);
a[0]=b[0]='-';
n=strlen(a)-1;
m=strlen(b)-1;
j=0;
suf[1]=0;
for(i=2; i<=n; i++)
{
if(a[i]==a[j+1])
suf[i]=++j;
else
{
while(a[i]!=a[j+1] && j!=0)
j=suf[j];
suf[i]=j;
}
}
for(int i=0;i<=n;i++)
cout<<a[i]<<" ";
cout<<endl;
for(int i=0;i<=n;i++)
cout<<suf[i]<<" ";
cout<<endl<<endl;
for(int i=0;i<=m;i++)
cout<<b[i]<<" ";
cout<<endl;
j=1;
for(int i=0; i<=m && nrn<=1000; i++)
{
if(b[i]==a[j+1] && j<=n)
j++;
else
{
while(b[i]!=a[j+1] && j!=0)
{
j=suf[j];
}
j++;
}
if(j>=n)
loc[nrn++]=i;
cout<<j<<" ";
}
if(nrn>1000)
nrn=1000;
printf("%d\n",nrn);
for(i=0;i<nrn;i++)
printf("%d ",loc[i]-n);
return 0;
}