Pagini recente » Cod sursa (job #1231829) | Cod sursa (job #2467335) | Cod sursa (job #2825354) | Cod sursa (job #1411923) | Cod sursa (job #2195494)
#include <iostream>
#include <fstream>
#include <cstring>
#define NMAX 2000010
using namespace std;
char pat[NMAX],text[NMAX];
int fai[NMAX],nrSol,sol[1001];
FILE *fin,*fout;
int mini(int a,int b)
{
return a<b ? a:b;
}
void read()
{
fin = fopen("strmatch.in","r");
fout = fopen("strmatch.out","w");
fscanf(fin,"%s",pat);
fscanf(fin,"%s",text);
}
void calcFai(char* pat)
{
fai[0] = -1;
fai[1] = 0;
int len = strlen(pat);
int j = 0;
for (int i = 2; i<=len ;i++)
{
while (j>0 && pat[i-1]!=pat[j]) j = fai[j];
if (pat[i-1] == pat[j]) j++;
fai[i] = j;
}
}
void KMP()
{
int n = strlen(text);
int m = strlen(pat);
int i = 0;
int j = 0;
while (i<n)
{
if (pat[j] == text[i]) {i++;j++;}
if (j == m)
{
nrSol++;
if (nrSol<=1000)
sol[nrSol] = i-j;
j = fai[j];
}
else if (i<n && pat[j]!=text[i])
{
if (j==0) i++;
else j = fai[j];
}
}
}
int main()
{
read();
calcFai(pat);
KMP();
fprintf(fout,"%d\n",nrSol);
for (int i = 1; i<=mini(1000,nrSol) ; i++)
fprintf(fout,"%d ",sol[i]);
fprintf(fout,"\n");
fclose(fin);
fclose(fout);
return 0;
}