Pagini recente » Cod sursa (job #2661464) | Cod sursa (job #2897033) | Cod sursa (job #1871040) | Cod sursa (job #1525387) | Cod sursa (job #1829224)
#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 == '\n' )
{
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=='\n')
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=='\n')
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 == '\n' || nod->fiu[*s-'a']==0)
return lg;
return prefix( nod->fiu[*s-'a'],s+1,lg+1);
}
char cuv[32];
int main()
{
ifstream in ("trie.in");
ofstream out ("trie.out");
int n;
while(!in.eof())
{
// in>>n;
//in>>cuv;
in.getline(cuv, 32);
strcat(cuv, "\n");
//for(int i=0;i<32;++i)
// {
// cout<<cuv[i]<<" ";
//}
switch (cuv[0])
{
case '0': ins(T, cuv+2);
break;
case '1': del(T, cuv+2);
break;
case '2': out<<aparitii(T, cuv+2)<<"\n";
break;
case '3': out<<prefix(T, cuv+2, 0)<<"\n";
break;
}
memset(cuv, 0, 32);
}
return 0;
}