Pagini recente » Cod sursa (job #2816551) | Cod sursa (job #1131671) | Cod sursa (job #555572) | Cod sursa (job #10503) | Cod sursa (job #1828728)
#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 )
{
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 )
{
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)
{
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)
{
if(*s == '\n' || 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 linie[32];
while(!in.eof())
{
in.getline(linie, 32);
switch (linie[0])
{
case '0': ins(T, linie+2);
break;
case '1': del(T, linie+2);
break;
case '2': cout<<aparitii(T, linie+2);
break;
case '3': cout<<prefix(T, linie+2, 0);
break;
}
}
return 0;
}