Pagini recente » Cod sursa (job #2069398) | Cod sursa (job #2215684) | Cod sursa (job #1398974) | Cod sursa (job #1038761) | Cod sursa (job #2273864)
#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;
}