Cod sursa(job #98929)

Utilizator mgntMarius B mgnt Data 10 noiembrie 2007 19:01:42
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Happy Coding 2007 Marime 2.54 kb
#include <iostream>
#include <fstream>
using namespace std;

int const MaxT = 10000000;
int const MaxD = 50000;
int const MaxC = 20;

static int Text   [1+MaxT];
static int Cuvant [1+MaxC];

class Copac {
public:
   Copac() { p[0] = 0; p [1] = 0; p[2] = 0;}
   ~Copac() {
    if (p [0]) delete p [0];
    if (p [1]) delete p [1];
    if (p [2]) delete p [2];
   }
  void Adauga(int * cuvant) {
    Copac ** x = p;
    Copac * y;
    while (4 != (*cuvant)) {
      y = x[(*cuvant)];
      if(0 == y) {
        y = new Copac;
        x[(*cuvant)] = y;
      }
      x = y->p;
      ++ cuvant;
    }
  }
  bool Cauta(int * cuvant) {
    Copac ** x = p;
    Copac * y;
    while (4 != (*cuvant)) {
      y = x[(*cuvant)];
      if(0 == y) return false;
      x = y->p;
      ++ cuvant;
    }
    return true;
  }
private:
  Copac * p [3];
};

class Copaci {
public:
  Copaci();
 ~Copaci();
  void Adauga(int * cuvant);
  bool Cauta(int prefix, int * cuvant);
private:
  Copac * p [59049];
};

Copaci::Copaci()
{
  int i;
  for(i=0;i<59049;i++) p[i]=0;
}

Copaci::~Copaci()
{
  int i;
  for(i=0;i<59049;i++) if(0!=p[i]) delete p[i];
}

void Copaci::Adauga(int * cuvant)
{
  int i,j,k;
  i=0;
  while(10>i && 4!=cuvant[i]) ++i;
  j=0; k=0;
  while(i>j) {k=3*k+cuvant[j]; ++j;}
  if(0==p[k]) p[k]=new Copac;
  p[k]->Adauga(&cuvant[i]);
}

bool Copaci::Cauta(int prefix, int * cuvant)
{
  if(0==p[prefix]) return false;
  return p[prefix]->Cauta(&cuvant[prefix]);
}

int main () {
  int i, n, m, cont, j, k, t;
  char ch;
  ifstream sin("abc2.in");
  i = 0;
  cout << "Read in..." << endl;
  while(true) {
    sin . get ( ch );
    Text [i] = ch;
    if('\n' == Text[i]) {
      Text[i] = 4;
      break;
    }
    Text[i] -= 'a';
    ++ i;
  }
  n = i;
  Copaci cop;
  m = 0;
  i = 0;
  while(true) {
    sin .get (ch);
    Cuvant[i] = ch;
    if(! sin) break;
    if('\n' == Cuvant [i]) {
      Cuvant[i] = 4;
      cop.Adauga(Cuvant);
      if(0 == m) m = i;
      i = 0;
      continue;
    }
    Cuvant[i] -= 'a';
    ++ i;
  }
  if(0 != i) {
    Cuvant[i] = 4;
    cop.Adauga(Cuvant);
    if(0 == m) m = i;
  }
  cout << "Count in..." << endl;
  cont = 0;
  if(0 != m) {
    i=n-m+1;k=0;if(10<m)j=10;else j=m; 
    while(i<n && 0<j) {
     k=3*k+Text[i];
     ++i;--j;
    }
    k=3*k;
    j=1;if(10<m)i=10;else i=m;
    while(1<i) {j=3*j;--i;}
    if(10<m)t=10;else t=m;
    for(i = n-m; i >= 0; i --) {
      k=j*Text[i]+k/3;
      Text[i+m] = 4;
      if(cop.Cauta(k, &Text[i+t])) ++ cont;
    }
  }
  ofstream sout("abc2.out");
  sout << cont << endl;
  cout << "end..." << endl;
  return 0;
}