Pagini recente » Cod sursa (job #1283395) | Cod sursa (job #1785253) | Cod sursa (job #1738452) | Cod sursa (job #3219224) | Cod sursa (job #845259)
Cod sursa(job #845259)
#include<iostream>
#include<fstream>
#include<string.h>
using namespace std;
#define LMAX 22
#define alfa 26
struct trie {
int fii,nr;
trie *urm[alfa];
};
typedef trie* TNOD;
TNOD rad;
char cuv[LMAX];
inline TNOD creare()
{
TNOD aux;
aux=new trie;
aux->fii=0;
aux->nr=0;
memset(aux->urm,0,sizeof(aux->urm));
return aux;
}
inline void adauga(char *s, TNOD p)
{
if(*s=='\n') {
p->nr++;
return ;
}
if(p->urm[*s-'a']==0) {
p->urm[*s-'a']=creare();
p->fii++;
}
adauga(s+1,p->urm[*s-'a']);
}
inline int sterge(char *s, TNOD p)
{
if(*s=='\n')
p->nr--;
else if(sterge(s+1,p->urm[*s-'a'])) {
p->urm[*s-'a']=0;
p->fii--;
}
if(p->fii==0 && p->nr==0 && p!=rad) {
delete p;
return 1;
}
return 0;
}
inline int cauta(char *s, TNOD p)
{
if(*s=='\n')
return p->nr;
if(p->urm[*s-'a'])
return cauta(s+1,p->urm[*s-'a']);
return 0;
}
inline int prefix(char *s, TNOD p)
{
if(*s=='\n')
return 0;
if(p->urm[*s-'a']!=0)
return 1+prefix(s+1,p->urm[*s-'a']);
else return 0;
}
int main ()
{
int opt;
ifstream f("trie.in");
ofstream g("trie.out");
rad=creare();
while(f>>opt) {
memset(cuv,0,sizeof(cuv));
f>>cuv;
cuv[strlen(cuv)]='\n';
if(opt==0)
adauga(cuv,rad);
else if(opt==1)
sterge(cuv,rad);
else if(opt==2)
g<<cauta(cuv,rad)<<'\n';
else g<<prefix(cuv,rad)<<'\n';
}
f.close();
g.close();
return 0;
}