Pagini recente » Cod sursa (job #132296) | Cod sursa (job #444504) | Cod sursa (job #1251870) | Cod sursa (job #721731) | Cod sursa (job #1728212)
#include <iostream>
#include <cstring>
#include <fstream>
#define Alfa_Size 27
using namespace std;
ofstream g("trie.out");
struct Trie
{
int nrWord,nrFii;
Trie *Litere[Alfa_Size];
Trie()
{
nrFii=nrWord=0;
memset(Litere,NULL,sizeof(Litere));
}
};
Trie *Rad;
void Add_In_Trie(Trie *nod,char *s)
{
if(*s==NULL){
++nod->nrWord;
return;
}
if(nod->Litere[*s-'a']==NULL){
++nod->nrFii;
nod->Litere[*s-'a']=new Trie;
}
Add_In_Trie(nod->Litere[*s-'a'],s+1);
}
inline int GetPref(Trie *nod,char *s,int dim)
{
if( *s==NULL || nod->Litere[*s-'a']==NULL)return dim;
return GetPref(nod->Litere[*s-'a'],s+1,dim+1);
}
inline int Nrcuv(Trie *nod,char *s)
{
if(*s==NULL){
return nod->nrWord;
}
if(nod->Litere[*s-'a']==NULL)return 0;
return Nrcuv(nod->Litere[*s-'a'],s+1);
}
inline bool DeleteWord(Trie *nod,char *s)
{
if(*s==NULL)--nod->nrWord;
else
if(DeleteWord(nod->Litere[*s-'a'],s+1)){
nod->Litere[*s-'a']=NULL;
--nod->nrFii;
}
if(!nod->nrFii && !nod->nrWord && nod!=Rad){
delete nod;
return 1;
}
return 0;
}
inline void ReadData()
{
Rad=new Trie;
ifstream f("trie.in");
char x[21]="";
while(f.getline(x,21)){
int val=x[0]-48;
switch(val)
{
case 0:{
Add_In_Trie(Rad,x+2);
break;
}
case 1:{
int a=DeleteWord(Rad,x+2);
break;
}
case 2:{
g<<Nrcuv(Rad,x+2)<<'\n';
break;
}
case 3:{
g<<GetPref(Rad,x+2,0)<<'\n';
break;
}
}
}
}
int main()
{
ReadData();
return 0;
}