Pagini recente » Cod sursa (job #2588688) | Cod sursa (job #638642) | Cod sursa (job #2636397) | Cod sursa (job #1371434) | Cod sursa (job #1491447)
#include <fstream>
using namespace std;
#define Lmax 25
#define ALF 26
struct trie
{
int nr, nrfii;
trie* fiu[ALF];
trie()
{
nr = nrfii = 0;
for(int i = 0; i < ALF; ++i) fiu[i] = NULL;
}
} *rad;
char s[Lmax];
void insert(char*) ;
bool remove(trie*, char*) ;
int count(char*) ;
int prefix(char*) ;
int main()
{
ifstream fin("trie.in");
ofstream fout("trie.out");
rad = new trie();
while(fin.getline(s, Lmax))
{
switch(s[0])
{
case '0': insert(s + 2); break;
case '1': remove(rad, s + 2); break;
case '2': fout << count(s + 2) << '\n'; break;
case '3': fout << prefix(s + 2) << '\n'; break;
}
}
return 0;
}
void insert(char* s)
{
trie *nod = rad;
while(*s != '\0')
{
if(nod -> fiu[*s - 'a'] == NULL)
{
++(nod -> nrfii);
nod -> fiu[*s - 'a'] = new trie();
}
nod = nod -> fiu[*s - 'a'];
++s;
}
++(nod -> nr);
}
bool remove(trie* nod, char* s)
{
if(*s != '\0')
{
if( remove(nod -> fiu[*s - 'a'], s + 1) )
{
nod -> fiu[*s - 'a'] = NULL;
--(nod -> nrfii);
}
if((nod -> nrfii) == 0 && (nod -> nr) == 0 && nod != rad)
{
delete nod;
return 1;
}
else return 0;
}
--(nod -> nr);
if((nod -> nrfii) == 0 && (nod -> nr) == 0 && nod != rad)
{
delete nod;
return 1;
}
return 0;
}
int count(char* s)
{
trie *nod = rad;
while(*s != '\0') nod = nod -> fiu[*s - 'a'], ++s;
return nod -> nr;
}
int prefix(char* s)
{
trie *nod = rad;
int rez;
for(rez = 0; *s != '\0' && (nod -> fiu[*s - 'a']) != NULL; ++s, ++rez)
nod = nod -> fiu[*s - 'a'];
return rez;
}