Cod sursa(job #2600206)

Utilizator anabatAna Batrineanu anabat Data 12 aprilie 2020 11:46:39
Problema Potrivirea sirurilor Scor 38
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#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++;
      if(sizev<1000)
        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++){
    fprintf(fout,"%d ",v[i]);
  }

  fclose(fin);
  fclose(fout);
  return 0;
}