Pagini recente » Cod sursa (job #2867077) | Cod sursa (job #707618) | Istoria paginii runda/avram_iancu_preoji_bis | Cod sursa (job #1577602) | Cod sursa (job #1452300)
#include <iostream>
#include <string.h>
#include <fstream>
#define NMAX 2000000
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;
f[0]=-1;
for(j=1;j<strlen(A);++j)
{
k=f[j-1];
while(k!=-1 && A[j-1]!=A[k])
k=f[k];
f[j]=k+1;
}
}
void KMP(char A[NMAX], char B[NMAX])
{
i=0;
j=0;
while(i<strlen(B))
{
while(j!=-1 && A[j]!=B[i])
j=f[j];
if(j==strlen(A)-1)
{sol[++N]=i-strlen(A)+1;j=0;}
else ++i,++j;
}
}
int main()
{
Citire();
FAILURE(A);
KMP(A,B);
fout<<N<<"\n";
if(N<=1000)
for(i=1;i<=N;++i)
fout<<sol[i]<<" ";
else
for(i=1;i<=1000;++i)
fout<<sol[i]<<" ";
return 0;
}