Pagini recente » Cod sursa (job #2073138) | Cod sursa (job #2108977) | Cod sursa (job #1700869) | Cod sursa (job #123820) | Cod sursa (job #1828740)
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
class Trie{
public:
int cnt, fii;
Trie *fiu[ 26 ];
Trie() ///constructor
{
cnt = 0;//nu avem cuvinte
fii = 0;//nu este prefix
memset(fiu,0,sizeof(fiu));
}
};
Trie *T = new Trie;
int ins( Trie *nod, char *c )
{
//cout<<"INSERT\n";
if( *c == 0 )
{
nod->cnt++;
return 0;
}
if(nod->fiu[*c-'a']==0)
{
nod->fiu[*c-'a'] = new Trie;
nod->fii++;
}
ins(nod->fiu[*c-'a'], c+1);
return 0;
}
int del( Trie *nod, char *c )
{
//cout<<"DEL\n";
if(*c==0)
nod->cnt--;
else if(del(nod->fiu[*c-'a'], c+1) )
{
nod->fiu[*c-'a'] = 0;
nod->fii--;
}
if(nod->cnt==0 && nod->fii == 0 && nod != T )
{
delete nod;
return 1;
}
return 0;
}
int aparitii(Trie *nod, char * c)
{
//cout<<"APARITII\n";
if(*c==0)
return nod->cnt;
if(nod->fiu[*c-'a'])
return aparitii(nod->fiu[*c-'a'],c+1);
return 0;
}
int prefix(Trie *nod, char *s, int lg)
{
//cout<<"PREFIX\n";
if(*s == 0 || nod->fiu[*s-'a']==0)
return lg;
return prefix( nod->fiu[*s-'a'],s+1,lg+1);
}
int main()
{
ifstream in ("trie.in");
ofstream out ("trie.out");
char cuv[32];
int n;
while(!in.eof())
{
in>>n;
in>>cuv;
//strcat(cuv, '\n');
switch (n)
{
case 0: ins(T, cuv);
break;
case 1: del(T, cuv);
break;
case 2: out<<aparitii(T, cuv)<<"\n";
break;
case 3: out<<prefix(T, cuv, 0)<<"\n";
break;
}
}
return 0;
}