Pagini recente » Cod sursa (job #96203) | Cod sursa (job #1384523) | Cod sursa (job #1103339) | Cod sursa (job #1758607) | Cod sursa (job #2667126)
#include <cstdio>
#include <cstring>
using namespace std;
struct trie
{
int cnt, nrfii;
trie *fiu[26];
trie()
{
cnt = nrfii = 0;
memset(fiu, 0, sizeof(fiu));
}
};
trie *T = new trie;
void addWord(trie *nod, char *s)
{
if(*s == NULL)
{
nod->cnt ++;
return;
}
if(nod->fiu[*s - 'a'] == 0)
{
nod->nrfii ++;
nod->fiu[*s - 'a'] = new trie;
}
addWord(nod->fiu[*s - 'a'], s + 1);
}
int deleteWord(trie *nod, char *s)
{
if(*s == NULL)
nod->cnt --;
else if(deleteWord(nod->fiu[*s - 'a'], s + 1))
{
nod -> fiu[*s - 'a'] = 0;
nod->nrfii --;
}
if(nod->nrfii == 0 && nod->cnt == 0 && nod != T)
{
delete nod;
return 1;
}
return 0;
}
int nrAp(trie *nod, char *s)
{
if(*s == NULL)
return nod->cnt;
if(nod->fiu[*s - 'a'])
return nrAp(nod->fiu[*s - 'a'], s + 1);
return 0;
}
int prefix(trie *nod , char *s , int lg)
{
if(*s == NULL || nod->fiu[*s - 'a'] == 0)
return lg;
return prefix(nod->fiu[*s - 'a'] , s + 1 , lg + 1);
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
int op;
char s[25];
while(scanf("%d ", &op) != EOF)
{
scanf("%s\n" , s);
if(op == 0)
addWord(T , s);
else if(op == 1)
deleteWord(T , s);
else if(op == 2)
printf("%d\n" , nrAp(T , s));
else
printf("%d\n" , prefix(T , s , 0));
}
return 0;
}