Pagini recente » Cod sursa (job #126266) | Cod sursa (job #2897337) | Cod sursa (job #2290756) | Istoria paginii runda/abcd56/clasament | Cod sursa (job #1452319)
#include <iostream>
#include <string.h>
#include <fstream>
#define NMAX 2000000
#define minim ((1000>N) ? N : 1000)
using namespace std;
ifstream fin ("strmatch.in");
ofstream fout ("strmatch.out");
char A[NMAX],B[NMAX];
int f[NMAX],sol[NMAX],i,j,k,N;
void Citire()
{
fin.getline(A,NMAX);
fin.getline(B,NMAX);
}
void FAILURE(char A[NMAX])
{
int k,lgA=strlen(A);
k=0;
f[1]=0;
for(j=2;j<=lgA;++j)
{
while(k>0 && A[j]!=A[k+1])
k=f[k];
if(A[k+1]==A[j])
++k;
f[j]=k;
}
for(i=0;i<lgA;++i)
cout<<f[i]<<" ";
}
void KMP(char A[NMAX], char B[NMAX])
{
i=1;
j=0;
int lgA=strlen(A),lgB=strlen(B);
while(i<=lgB)
{
while(j>0 && A[j+1]!=B[i])
j=f[j];
if(A[j+1]==B[i])
++j;
if(j==lgA-1)
sol[N]=i-lgA+1,j=0,++N;
++i;
}
}
int main()
{
Citire();
FAILURE(A);
KMP(A,B);
fout<<N<<"\n";
for(i=0;i<minim;++i)
fout<<sol[i]<<" ";
return 0;
}