Pagini recente » Cod sursa (job #2452948) | Cod sursa (job #1432429) | Cod sursa (job #2839425) | Cod sursa (job #1118007) | Cod sursa (job #310116)
Cod sursa(job #310116)
#include <stdio.h>
#define Nmax 100100
char *p, sir[Nmax];
struct Trie
{
int cnt,nrfii;
Trie *a[26];
Trie()
{
cnt = nrfii = 0;
for (int i=0;i<26;++i)
a[i] = 0;
}
};
Trie *T;
void add(Trie *nod, char *p)
{
if (*p == '\n')
{
++nod->cnt;
return;
}
if (nod->a[*p-'a'] == 0)
{
nod->a[*p-'a'] = new Trie;
++nod->nrfii;
}
add(nod->a[*p-'a'],p+1);
}
int del(Trie *nod, char *p)
{
if( *p == '\n' )
--nod->cnt;
else if(del(nod->a[*p - 'a'], p+1))
{
nod->a[*p-'a'] = 0;
--nod->nrfii;
}
if(nod->cnt == 0 && nod->nrfii == 0 && nod != T)
{
delete nod;
return 1;
}
return 0;
}
int exista(Trie *nod, char *p)
{
if (*p == '\n')
return nod->cnt;
if (nod->a[*p-'a'] != 0)
return exista(nod->a[*p-'a'],p+1);
return 0;
}
int prefix(Trie *nod, char *p)
{
if ((*p == '\n') || (nod->a[*p-'a'] == 0))
return nod->cnt;
return exista(nod->a[*p-'a'],p+1);
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w",stdout);
T = 0;
while (!feof(stdin))
{
fgets(sir,Nmax,stdin);
if (sir[0] == '0')
add(T,sir+2);
if (sir[0] == '1')
del(T,sir+2);
if (sir[0] == '2')
printf("%d\n", exista(T,sir+2));
if (sir[0] == '3')
printf("%d\n", prefix(T,sir+2));
}
return 0;
}