Pagini recente » Cod sursa (job #2923119) | Cod sursa (job #3242312) | Cod sursa (job #2588472) | Cod sursa (job #2965102) | Cod sursa (job #150272)
Cod sursa(job #150272)
#include <fstream>
#include <string.h>
#include <stdio.h>
#define LMAX 2000000
using namespace std;
long n,m;
char t[LMAX],p[LMAX];
long u[LMAX];
long li[1024],tl=0;
void precalc(char *p)
{
int k=-1,x;
u[0]=0;
for(x=1;x<m;x++)
{
while(k>0 && p[k+1]!=p[x]) k=u[k];
if(p[k+1]==p[x])k++;
u[x]=k;
}
}
void cit()
{
ifstream f("grader_test21.in");
f.getline(p,LMAX);
m=strlen(p);
f.getline(t,LMAX);
n=strlen(t);
}
void brute()
{
int i,x=-1;
for(i=0;i<n;i++)
{
while(x>0 && p[x+1]!=t[i]) x=u[x];
if(p[x+1]==t[i]) x++;
if(x==m-1)
{
//printf("%d ",i-m+1);
if(tl<1000)
{
li[tl]=i-m+1;
tl++;
}
else
{
tl++;
}
x=u[x];
}
}
}
void tip()
{
FILE *f;
int i;
f=fopen("strmatch.out","w");
fprintf(f,"%d\n",tl);
if(tl)
{
if(tl<1000)
{
for(i=0;i<tl-1;i++)
fprintf(f,"%d ",li[i]);
fprintf(f,"%d\n",li[tl-1]);
}
if(tl>=1000)
{
for(i=0;i<999;i++)
fprintf(f,"%d ",li[i]);
fprintf(f,"%d\n",li[999]);
}
}
fclose(f);
}
int main()
{
cit();
precalc(p);
brute();
tip();
return 0;
}