Cod sursa(job #743102)
#include <stdio.h>
#include <string.h>
struct ntrie
{int nr,nrfii;
ntrie *nexts[26];
ntrie()
{nr = nrfii = 0;
memset(nexts,0,sizeof(nexts));}};
ntrie *X = new ntrie;
char cuv[10000];
void put(ntrie *nod, char *p)
{if (*p == '\n')
{nod->nr++;
return;}
if (nod->nexts[*p-'a'] == 0)
{nod->nexts[*p-'a'] = new ntrie;
nod->nrfii++;}
put(nod->nexts[*p-'a'],p+1);}
int del(ntrie *nod, char *sir)
{if(*sir=='\n')
nod->nr--;
else
if(del(nod->nexts[*sir - 'a'], sir+1))
{nod->nexts[*sir-'a'] = 0;
nod->nrfii--;}
if(nod->nr == 0 && nod->nrfii == 0 && nod != X)
{delete nod;
return 1;}
return 0;}
int number(ntrie *nod, char *sir)
{if (*sir == '\n')
return nod->nr;
if (nod->nexts[*sir-'a'] != 0)
return number(nod->nexts[*sir-'a'],sir+1);
return 0;}
int pref(ntrie *nod, char *sir,int k)
{if((*sir == '\n')||(nod->nexts[*sir-'a'] == 0))
return k;
return pref(nod->nexts[*sir-'a'],sir+1,k+1);}
int main()
{freopen("trie.in", "r", stdin);
freopen("trie.out", "w",stdout);
fgets(cuv,100,stdin);
do {if (cuv[0] == '0')
put(X,cuv+2);
if (cuv[0] == '1')
del(X,cuv+2);
if (cuv[0] == '2')
printf("%d\n", number(X,cuv+2));
if (cuv[0] == '3')
printf("%d\n", pref(X,cuv+2,0));
fgets(cuv,100,stdin);
} while (!feof(stdin));
return 0;}