Pagini recente » Cod sursa (job #2368608) | Cod sursa (job #653004) | Cod sursa (job #592657) | Cod sursa (job #722351) | Cod sursa (job #2795660)
#include <stdio.h>
#include <string.h>
#define LMAX 2000000
#define MOD1 100007
#define MOD2 100021
#define BASE 256
int v[1000];
char sir[LMAX + 1];
int lsir;
char subs[LMAX + 1];
int lsubs;
int hash(char sir[],int l,int MOD){
int h,i;
i=h=0;
while(i<l){
h=(h*BASE+sir[i])%MOD;
i++;
}
return h;
}
int cautare(int lsir,int lsubs){
int sirh1,sirh2,subsh1,subsh2,pow1,pow2,i,nr;
subsh1=hash(subs,lsubs,MOD1);
subsh2=hash(subs,lsubs,MOD2);
sirh1=hash(sir,lsubs,MOD1);
sirh2=hash(sir,lsubs,MOD2);
pow1=pow2=1;
for(i=0;i<lsubs-1;i++){
pow1=pow1*BASE%MOD1;
pow2=pow2*BASE%MOD2;
}
i=lsubs;
nr=0;
while(i<=lsir){
if(subsh1==sirh1 && subsh2==sirh2){
if(nr<1000)
v[nr]=i-lsubs;
nr++;
}
sirh1-=sir[i-lsubs]*pow1%MOD1;
sirh2-=sir[i-lsubs]*pow2%MOD2;
if(sirh1<0)
sirh1+=MOD1;
if(sirh2<0)
sirh2+=MOD2;
sirh1=(sirh1*BASE+sir[i])%MOD1;
sirh2=(sirh2*BASE+sir[i])%MOD2;
i++;
}
return nr;
}
int main(){
int i,nr;
FILE *fin,*fout;
fin=fopen("strmatch.in", "r");
fout=fopen("strmatch.out", "w");
fgets(subs,sizeof(subs),fin);
lsubs=strlen(subs);
if(subs[lsubs-1]=='\n')
subs[--lsubs]=0;
fgets(sir,sizeof(sir),fin);
lsir=strlen(sir);
if(sir[lsir-1]=='\n')
sir[--lsir]=0;
nr=cautare(lsir,lsubs);
fprintf(fout,"%d\n",nr);
if(nr>1000)
nr=1000;
for(i=0;i<nr;i++)
fprintf(fout,"%d ",v[i]);
fclose(fin);
fclose(fout);
return 0;
}