Pagini recente » Cod sursa (job #2981661) | Cod sursa (job #391347) | Cod sursa (job #779960) | Cod sursa (job #1080348) | Cod sursa (job #1419749)
#include <fstream>
#include <cstring>
#include <string>
#define NMAX 21
#define ALF 27
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
class nod
{
public:
int numar_cuvinte, numar_litere_ocupate;
nod *urm[ALF];
nod()
{
numar_cuvinte=numar_litere_ocupate=0;
for (int i=0; i<ALF; ++i) urm[i]=NULL;
}
bool operator=(nod *aux)
{
numar_cuvinte=aux->numar_cuvinte;
numar_litere_ocupate=aux->numar_litere_ocupate;
for (int i=0; i<ALF; ++i) urm[i]=aux->urm[i];
return 1;
}
}*rad;
string cuv;
int op;
void adauga(string cuv)
{
nod *p=rad, *q;
for (unsigned int i=0; i<cuv.length(); ++i)
if (p->urm[cuv[i]-'a']!=NULL) p=p->urm[cuv[i]-'a'];
else
{
++(p->numar_litere_ocupate);
q=new nod;
p->urm[cuv[i]-'a']=q;
p=q;
}
++(p->numar_cuvinte);
}
void sterge(string cuv)
{
nod *p=rad, *stiva[NMAX];
unsigned int lungime_stiva=0;
stiva[lungime_stiva++]=rad;
for (unsigned int i=0; i<cuv.length(); ++i)
{
p=p->urm[cuv[i]-'a'];
stiva[lungime_stiva++]=p;
}
(stiva[lungime_stiva-1]->numar_cuvinte)--;
while (lungime_stiva>1)
{
--lungime_stiva;
if (!stiva[lungime_stiva]->numar_cuvinte && !stiva[lungime_stiva]->numar_litere_ocupate)
{
delete stiva[lungime_stiva];
stiva[lungime_stiva-1]->urm[cuv[lungime_stiva-1]-'a']=NULL;
--(stiva[lungime_stiva-1]->numar_litere_ocupate);
}
else break;
}
}
int numar_aparitii(string cuv)
{
nod *p=rad;
for (unsigned int i=0; i<cuv.length(); ++i)
if (p->urm[cuv[i]-'a']==NULL) return 0;
else p=p->urm[cuv[i]-'a'];
return p->numar_cuvinte;
}
int lungime_prefix_comun(string cuv)
{
nod *p=rad;
for (unsigned int i=0; i<cuv.length(); ++i)
if (p->urm[cuv[i]-'a']==NULL) return i;
else p=p->urm[cuv[i]-'a'];
return cuv.length();
}
int main()
{
rad=new nod;
while (f>>op>>cuv)
{
switch (op)
{
case 0: adauga(cuv);break;
case 1: sterge(cuv);break;
case 2: g<<numar_aparitii(cuv)<<"\n";break;
case 3: g<<lungime_prefix_comun(cuv)<<"\n";break;
}
}
f.close();
g.close();
return 0;
}