Cod sursa(job #856783)

Utilizator taigi100Cazacu Robert taigi100 Data 16 ianuarie 2013 22:29:27
Problema Potrivirea sirurilor Scor 14
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#define Nm 2000005

#include <stdio.h>
#include <string.h>
#include <iostream>

int D[256];
char To[Nm],P[Nm],*T;
int Tl,Pl;
int cont;
int v[1005];
void initialize_Lenght()
{
	Tl=strlen((char*)To);
	Pl=strlen((char*)P);
	T=To;
}
void compute_D()
{
	for(int i=0;i<256;i++)
		D[i]=Pl;
	for(int i=0;i<Pl;i++)
		D[P[i]]=Pl-i;
}
void Boyer_Moore()
{
	int i;
	
	while ( Tl>=Pl ) 	
	{
		for(i=Pl-1;T[i]==P[i]&&i>=0;i--)
			if(i==0)
			{
				if(cont<1000)
					v[cont]=(T-To);
				cont++;
			}
		Tl -= D[T[i+1]];
		T += D[T[i+1]];
	}
}
int main()
{
	FILE *f=fopen("strmatch.in","r");
	FILE *g=fopen("strmatch.out","w");
    fscanf(f,"%s %s",P,To);
	initialize_Lenght();
	compute_D();
	Boyer_Moore();
	fprintf(g,"%d\n",cont);
	for(int i=0;i<cont;i++)
	{
	   if(i>1000)
		   i=cont+10;
	   else
		   fprintf(g,"%d-%d ",v[i],strncmp(P,To+v[i],Pl));
	}
}