Cod sursa(job #2273286)

Utilizator cezar.plescaCezar Plesca cezar.plesca Data 31 octombrie 2018 11:39:22
Problema Potrivirea sirurilor Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include<stdio.h>
#include<string.h>

char cuv[2000001];
char sir[2000001];

int nb;
int poz[2000000];

int b=73;
int p=100007;

// calculul puterii lui b la puterea m-1 modulo p
int computePower(int b,int m,int p){
	int bpower=1;
	for(int i=1;i<=m-1;i++)
		bpower=(bpower*b)%p;
	return bpower;
}

// functia de hash folosita
int hash(char* string, int m, int b, int p){
	int h=0, bpower=1;
	for(int i=m-1;i>=0;i--){
		h=(h+string[i]*bpower)%p; // actualizarea progresiva a codului
		bpower=(bpower*b)%p; // calculul puterilor lui b
	}
	return h;
}

// algoritmul Rabin-Karp
void rabinkarp(char* pattern, int m, char* text, int n, int b, int p){
	int B=computePower(b,m,p);
	int hp=hash(pattern,m,b,p);
	int H=hash(text,m,b,p);
	
	int j;
	for(int i=0;i<=n-m;i++){ // potrivire pe pozitia i
		if(H==hp){
			for(j=0;j<m;j++){ // comparatia cu patternul
				if(text[i+j]!=pattern[j])
					break;
			}
			if(j==m){
				nb++;
				if(nb<=1000)
					poz[nb-1]=i;
				//printf("Potrivire la pozitia % d\n",i);
			}
		}
		if(i<n-m){
			H=(b*(H-text[i]*B)+text[m+i])%p;
			if(H<0) H+=p;
		}
	}
}

int main(){
	FILE* f= fopen("strmatch.in","rt");
	FILE* g= fopen("strmatch.out","wt");
	
	fscanf(f,"%s",cuv);
	fscanf(f,"%s",sir);

	int m=strlen(cuv);
	int n=strlen(sir);

	rabinkarp(cuv,m,sir,n,b,p);

	fprintf(g,"%d\n",nb);
	for(int i=0;i<nb;i++){
		if(i<1000)
			fprintf(g,"%d ",poz[i]);			
	}

	fclose(g);
	fclose(f);
	return 0;
}