Cod sursa(job #2273864)

Utilizator cezar.plescaCezar Plesca cezar.plesca Data 1 noiembrie 2018 08:29:21
Problema Potrivirea sirurilor Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#include<stdio.h>
#include<string.h>

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

int nb;
int poz[2000000];

int base=257;
int p1=10007;
int p2=10009;

/*
int p;
int bits=16;
int mask;
*/

void rabinkarp(char* pattern, int m, char* text, int n){
	
	int hp1=0, B1=1, H1=0;
	int hp2=0, B2=1, H2=0;	
	int bpower1=1,bpower2=1;
	
	for(int i=0;i<m;i++){
		hp1=(hp1*base+pattern[i])%p1; // actualizarea progresiva a codului
		hp2=(hp2*base+pattern[i])%p2; // actualizarea progresiva a codului

		H1=(H1*base+text[i])%p1; // actualizarea progresiva a codului
		H2=(H2*base+text[i])%p2; // actualizarea progresiva a codului

		B1=bpower1;
		B2=bpower2;

		bpower1=(bpower1*base)%p1; // calculul puterilor lui b
		bpower2=(bpower2*base)%p2; // calculul puterilor lui b
	}
	
	/*
	for(int i=0;i<m;i++){
		hp=(hp*base+pattern[i]) & mask; // actualizarea progresiva a codului	
		H=(H*base+text[i]) & mask ; // actualizarea progresiva a codului
		B=bpower;
		bpower=(bpower*base) & mask; // calculul puterilor lui b
	}
	*/

	int j;
	for(int i=0;i<=n-m;i++){ // potrivire pe pozitia i
		if(H1==hp1 && H2==hp2){
			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;
			}
		}
		if(i<n-m){
			H1=(base*((H1-text[i]*B1)%p1+p1)+text[m+i])%p1;
			H2=(base*((H2-text[i]*B2)%p2+p2)+text[m+i])%p2;
		}
	}
}

int main(){

	/*
	p=1<<bits;
	mask=p-1;
	*/
	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);

	if(m>n){
		fprintf(g,"0\n");
		return 0;
	}

	rabinkarp(cuv,m,sir,n);

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

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