Pagini recente » Cod sursa (job #162078) | Cod sursa (job #453450) | Cod sursa (job #1532583) | Cod sursa (job #764372) | Cod sursa (job #98929)
Cod sursa(job #98929)
#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;
}