Pagini recente » Cod sursa (job #2105046) | Cod sursa (job #1554449) | Cod sursa (job #1665064) | Cod sursa (job #795940) | Cod sursa (job #430617)
Cod sursa(job #430617)
#include<stdio.h>
#include<string.h>
struct trie
{
int cnt, nrfii;
trie *fiu[26];
trie()
{
nrfii=0;
cnt=0;
memset(fiu, 0, sizeof(fiu));
}
};
trie *t=new trie;
char s[25];
void insert(trie *nod, char *aux)
{
int x=(int)*aux-'a';
if(*aux=='\n')
{
nod->cnt++;
}
else
{
if(nod->fiu[x]==0)
{
nod->fiu[x]=new trie;
nod->nrfii++;
}
insert(nod->fiu[x], aux+1);
}
}
int del(trie *nod, char *aux)
{
int x=(int)*aux-'a';
if(*aux=='\n')
nod->cnt--;
else if(del(nod->fiu[x], aux+1)==1)
{
nod->nrfii--;
nod->fiu[x]=0;
}
if(nod->nrfii==0&&nod!=t&&nod->cnt==0)
{
delete nod;
return 1;
}
return 0;
}
int query(trie *nod, char *aux)
{
int x=(int)*aux-'a';
if(*aux=='\n')
return nod->cnt;
if(nod->fiu[x]!=0)
return query(nod->fiu[x], aux+1);
return 0;
}
int prefix(trie *nod, char *aux, int k)
{
int x=(int)*aux-'a';
if(*aux=='\n'||nod->fiu[x]==0)
return k;
else return prefix(nod->fiu[x],aux+1,k+1);
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
do{
fgets(s,25,stdin);
if(s[0]=='0')
insert(t, s+2);
else if(s[0]=='1')
del(t, s+2);
else if(s[0]=='2')
printf("%d\n", query(t, s+2));
else printf("%d\n", prefix(t, s+2, 0));
}while(!feof(stdin));
return 0;
}