Pagini recente » Cod sursa (job #1996038) | Cod sursa (job #2002569)
#include <cstdio>
using namespace std;
const int nmax = 20;
char v[nmax+3];
int nr;
struct trie{
trie* next[26];
int apcuvant;
int subarbore;
trie()
{
for(int i = 0;i <= 25;i ++)
{
next[i] = NULL;
}
apcuvant = 0;
subarbore = 0;
}
};
trie *rad = NULL;
trie* adauga(char v[], trie *act)
{
if(act == NULL)
act = new trie;
act -> subarbore ++;
if(v[0] >= 'a' && v[0] <= 'z')
{
act -> next[v[0] - 'a'] = adauga(v+1, act -> next[v[0] - 'a']);
}
else
{
act -> apcuvant ++;
}
return act;
}
trie* sterge(char v[], trie *act)
{
act -> subarbore --;
if(v[0] >= 'a' && v[0] <= 'z')
act -> next[v[0] - 'a'] = sterge(v+1,act -> next[v[0] - 'a']);
else
{
act -> apcuvant --;
}
if(act -> subarbore == 0)
{
delete act;
return NULL;
}
else
{
return act;
}
}
int print(char v[], trie *act)
{
if(act == NULL)
return 0;
if(v[0] < 'a' || v[0] > 'z')
return act -> apcuvant;
else {
return print(v+1,act -> next[v[0] - 'a']);
}
}
int prefix(char v[], trie *act)
{
if(act == NULL)
{
return nr-1;
}
if(act -> subarbore <= 1)
return nr;
if(v[0] >= 'a' && v[0] <= 'z'){
nr ++;
return prefix(v+1,act -> next[v[0] - 'a']);
}
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
int t;
while(scanf("%d %s",&t,&v) != EOF)
{
if(t == 0)
rad = adauga(v,rad);
if(t == 1)
rad = sterge(v,rad);
if(t == 2)
printf("%d\n",print(v,rad));
if(t == 3){
printf("%d\n",prefix(v,rad));
nr = 0;
}
}
return 0;
}