Pagini recente » Cod sursa (job #1028534) | Cod sursa (job #1899634) | Cod sursa (job #2825688) | Cod sursa (job #2549071) | Cod sursa (job #2273332)
#include<stdio.h>
#include<string.h>
char cuv[2000001];
char sir[2000001];
int nb;
int poz[2000000];
int base=73;
int p=10007;
void rabinkarp(char* pattern, int m, char* text, int n){
int hp=0, B=1, H=0;
int bpower=1;
for(int i=m-1;i>=0;i--){
hp=(hp+pattern[i]*bpower)%p; // actualizarea progresiva a codului
H=(H+text[i]*bpower)%p; // actualizarea progresiva a codului
B=bpower;
bpower=(bpower*base)%p; // calculul puterilor lui b
}
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;
}
}
if(i<n-m){
H=(base*(H-(text[i]*B)%p+p)+text[m+i])%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);
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;
}