Cod sursa(job #2795660)

Utilizator albertaizicAizic Albert albertaizic Data 6 noiembrie 2021 19:17:11
Problema Potrivirea sirurilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#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;
}