Pagini recente » Arbori de intervale si aplicatii in geometria computationala | Cod sursa (job #620912) | Egyptian Fractions | Cod sursa (job #1790828) | Cod sursa (job #2078461)
#include <cstdio>
using namespace std;
char sir[25];
class Nod
{
public:
int nr, nr_sons;
Nod *vec[30];
Nod();
};
Nod :: Nod()
{
nr = 0;
nr_sons = 0;
for(int i = 0 ; i <= 29 ; ++i)
{
vec[i] = NULL;
}
}
class Trie
{
private:
Nod *root;
public:
Trie();
void insert(int poz);
void insert(Nod *n, int poz);
void find(int poz);
void find(Nod *n, int poz);
int del(int poz);
int del(Nod *n, int poz);
void prefix(int poz);
void prefix(Nod *n, int poz);
};
Trie :: Trie()
{
root = new Nod;
}
Trie *tree = new Trie;
void Trie :: insert(int poz)
{
insert(root, poz);
}
void Trie :: insert(Nod *n, int poz)
{
if(!sir[poz])
{
n->nr++;
return;
}
if(n->vec[sir[poz] - 'a'] == NULL)
{
n->vec[sir[poz] - 'a'] = new Nod;
n->nr_sons++;
}
insert(n->vec[sir[poz] - 'a'], poz + 1);
}
void Trie :: find(int poz)
{
find(root, poz);
}
void Trie :: find(Nod *n, int poz)
{
if(!sir[poz])
{
printf("%d\n",n->nr);
return;
}
if(n->vec[sir[poz] - 'a'])
{
find(n->vec[sir[poz] - 'a'], poz + 1);
}
else
{
printf("0\n");
}
}
int Trie :: del(int poz)
{
del(root, poz);
}
int Trie :: del(Nod *n, int poz)
{
if(!sir[poz])
{
n->nr--;
}
else
{
if(del(n->vec[sir[poz] - 'a'], poz + 1))
{
n->vec[sir[poz] - 'a'] = NULL;
n->nr_sons--;
}
}
if(!n->nr_sons && !n->nr && n != root)
{
delete n;
return 1;
}
return 0;
}
void Trie :: prefix(int poz)
{
prefix(root, poz);
}
void Trie :: prefix(Nod *n, int poz)
{
if(!sir[poz])
{
printf("%d\n", poz);
return;
}
if(n->vec[sir[poz] - 'a'])
{
prefix(n->vec[sir[poz] - 'a'], poz + 1);
}
else
{
printf("%d\n", poz);
}
}
void citire()
{
int caz;
while(!feof(stdin))
{
scanf("%d %s\n", &caz, &sir);
switch(caz)
{
case 0: tree->insert(0); break;
case 1: tree->del(0); break;
case 2: tree->find(0); break;
case 3: tree->prefix(0); break;
}
}
printf("\n");
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
citire();
}