Cod sursa(job #527381)

Utilizator Light532Light 532 Light532 Data 31 ianuarie 2011 13:06:15
Problema Potrivirea sirurilor Scor 14
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#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;
}