Pagini recente » Cod sursa (job #2587631) | Cod sursa (job #1201729) | Cod sursa (job #3168344) | Cod sursa (job #164625) | Cod sursa (job #2600208)
#include <stdio.h>
#include <string.h>
using namespace std;
#define NMAX 2000000
#define BAZA 128 ///facem totul baza 128 si fol codul ascii ca si codificare
#define MOD1 666013
#define MOD2 666019
char a[NMAX+1],b[NMAX+1];
int v[NMAX+1];
int deletecif(int cif,int pow){
return cif*pow;
}
int main()
{
FILE *fin,*fout;
fin=fopen("strmatch.in","r");
fout=fopen("strmatch.out","w");
int i,j,nra,sizea,sirurimatch,nrb,inceput,sfarsit,pow,sizeb,sizev,nrb2,nra2,pow2;
fscanf(fin,"%s",a);
fscanf(fin,"%s",b);
sizea=strlen(a);
nra=0;
nra2=0;
i=0;
while(a[i]!='\0'){
nra=((nra*128)%MOD1+a[i]%MOD1)%MOD1;
nra2=((nra2*128)%MOD2+a[i]%MOD2)%MOD2;
i++;
}
nrb=0;
nrb2=0;
sizeb=0;
j=0;
while(sizeb<sizea){
nrb=((nrb*128)%MOD1+b[j]%MOD1)%MOD1;
nrb2=((nrb2*128)%MOD2+b[j]%MOD2)%MOD2;
sizeb++;
j++;
}
pow=1;
pow2=1;
for(i=1;i<=sizea-1;i++){
pow=(pow*128)%MOD1;
pow2=(pow2*128)%MOD2;
}
sirurimatch=0;
inceput=0;
sfarsit=sizea;
sizev=0;
while(b[j]!='\0'){
if(nra==nrb&&nra2==nrb2){
sirurimatch++;
v[sizev++]=inceput;
}
nrb=(nrb%MOD1-(deletecif(b[inceput],pow)%MOD1)+MOD1)%MOD1;///scoatem de la inceput
nrb2=(nrb2%MOD2-(deletecif(b[inceput],pow2)%MOD2)+MOD2)%MOD2;///scoatem de la inceput
inceput++;
nrb=((nrb*128)%MOD1+b[j]%MOD1)%MOD1; ///adaugam la sfarsit
nrb2=((nrb2*128)%MOD2+b[j]%MOD2)%MOD2; ///adaugam la sfarsit
sfarsit++;
j++;
}
fprintf(fout,"%d\n",sirurimatch);
for(i=0;i<sizev&&i<1000;i++){
fprintf(fout,"%d ",v[i]);
}
fclose(fin);
fclose(fout);
return 0;
}