Pagini recente » Cod sursa (job #2552395) | Cod sursa (job #422668) | Cod sursa (job #2092979) | Cod sursa (job #2597216) | Cod sursa (job #310127)
Cod sursa(job #310127)
#include <stdio.h>
#include <string.h>
#define Nmax 100100
char sir[Nmax];
struct Trie
{
int cnt,nrfii;
Trie *a[26];
Trie()
{
cnt = nrfii = 0;
memset(a,0,sizeof(a));
}
};
Trie *T = new Trie;
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,int k)
{
if ((*p == '\n') || (nod->a[*p-'a'] == 0))
return k;
return prefix(nod->a[*p-'a'],p+1,k+1);
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w",stdout);
fgets(sir,Nmax,stdin);
do
{
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,0));
fgets(sir,Nmax,stdin);
} while (!feof(stdin));
return 0;
}