Pagini recente » Cod sursa (job #1010844) | Cod sursa (job #1265196) | Cod sursa (job #414917) | Cod sursa (job #1814560) | Cod sursa (job #2273286)
#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;
}