Cod sursa(job #2923149)

Utilizator raileanu-alin-gabrielRaileanu Alin-Gabriel raileanu-alin-gabriel Data 11 septembrie 2022 19:20:12
Problema Potrivirea sirurilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <fstream>
#include <vector>
#include <cstring>
#pragma GCC optimize ("03")
const int B=127;
const int MOD1=666013;
const int MOD2=1000003;

using namespace std;
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");

char a[2000005], b[2000005];
vector <int> v;
int lga, lgb, pt1, pt2, cod1a, cod1b, i, cod2b, cod2a;

int h(char *, int, int, int);
int next_hash(char *, int, int, int, int, int);
int rid_pt(int, int, int);

int main()
{
  fin>>a>>b;
  lga=strlen(a); lgb=strlen(b);
  if(lga>lgb)
  {
    fout<<0<<'\n';
    return 0;
  }
  cod1a=h(a, 0, lga-1, MOD1); cod2a=h(a, 0, lga-1, MOD2);
  cod1b=h(b, 0, lga-1, MOD1); cod2b=h(b, 0, lga-1, MOD2);
  if(cod1a==cod1b && cod2a==cod2b)
  {
    v.push_back(0);
  }
  pt1=rid_pt(B, lga-1, MOD1);
  pt2=rid_pt(B, lga-1, MOD2);
  for(i=lga; i<lgb; i++)
  {
    cod1b=next_hash(b, i, i-lga, cod1b, pt1, MOD1);
    cod2b=next_hash(b, i, i-lga, cod2b, pt2, MOD2);
    if(cod1b==cod1a && cod2a==cod2b)
    {
      v.push_back(i-lga+1);
    }
  }
  fout<<v.size()<<'\n';
  for(i=0; i<min(1000, int(v.size())); i++) fout<<v[i]<<' ';
  fout<<'\n';
}

int h(char *a, int start, int final, int MOD)
{
  int i, hs=0;
  for(i=start; i<=final; i++)
  {
    hs=((hs*B)%MOD+int(a[i]))%MOD;
  }
  return hs;
}

int rid_pt(int nr, int pt, int MOD)
{
  int p=1;
  while(pt--)
  {
    p=(p*nr)%MOD;
  }
  return p;
}

int next_hash(char *s, int poz, int pozf, int cod, int pt, int MOD)
{
  int elim = ( cod - ( int(s[pozf]) * pt ) %MOD + MOD ) %MOD;
  cod=(elim * B + int(s[poz]) )%MOD;
  return cod;
}