Pagini recente » Cod sursa (job #2079828) | Cod sursa (job #2193907) | Cod sursa (job #1582686) | Cod sursa (job #180327) | Cod sursa (job #527381)
Cod sursa(job #527381)
#include <stdio.h>
#include <math.h>
int apps[1000];
int n,m,nSize;
char text[2000000];
char pattern[2000000];
int fail[2000000];
int RabinKarp(char *s, int n, char *p, int m, int *apps, int &nSize)
{
int q=1000003; //prime number
int d=2;
int y;
int x;
int i;
int equality;
if(n<m)
{
return 0;
}
//preprocessing y;
y=0;
for(i=0;i<m;i++)
{
y = y+p[i]*(int)pow((double)d,(double)m-1-i)%q;
}
//preprocessing x;
x=0;
for(i=0;i<m;i++)
{
x = x+s[i]*(int)pow((double)d,(double)m-1-i)%q;
}
i=0;
while(i+m-1<n)
{
if(x==y)
{
//possible equality
equality = 1;
for(int j=0;j<m;j++)
{
if(s[i+j] != p[j])
{
equality = 0;
break;
}
}
if(equality && nSize<1000)
{
apps[nSize] = i;
nSize++;
}
if(equality && nSize>=1000)
{
nSize++;
}
}
i++;
x = ((x-s[i-1]*(int)pow((double)d,(double)m-1))* d + s[i+m-1])%q;
}
return 0;
}
int main()
{
FILE *f,*g;
int i;
f = fopen("strmatch.in","r");
g = fopen("strmatch.out","w");
fscanf(f,"%s %s",pattern,text);
n=0;
m=0;
while(pattern[m] != 0)
m++;
while(text[n] != 0)
n++;
RabinKarp(text,n,pattern,m,apps,nSize);
fprintf(g,"%d\n",nSize);
if(nSize>1000)
{
nSize = 1000;
}
for(i=0;i<nSize;i++)
{
fprintf(g,"%d ",apps[i]);
}
fclose(f);
fclose(g);
return 0;
}