Cod sursa(job #743098)
#include <stdio.h>
#include <string.h>
#include <fstream.h>
struct ntrie
{int nr,nrfii;
ntrie *nexts[30];
ntrie()
{nr=nrfii= 0;
memset(nexts,0,sizeof(nexts));}
};
ntrie *X = new ntrie;
char cuv[100];
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 dele(ntrie *nod, char *p)
{if( *p == '\n' )
nod->nr--;
else if(dele(nod->nexts[*p - 'a'], p+1))
{nod->nexts[*p-'a'] = 0;
nod->nrfii--;}
if(nod->nr == 0 && nod->nrfii == 0 && nod != X)
{delete nod;
return 1;}
return 0;}
int number(ntrie *nod, char *p)
{if (*p == '\n')
return nod->nr;
if (nod->nexts[*p-'a'] != 0)
return number(nod->nexts[*p-'a'],p+1);
return 0;}
int pref(ntrie *nod, char *p,int k)
{
if ((*p == '\n') || (nod->nexts[*p-'a'] == 0))
return k;
return pref(nod->nexts[*p-'a'],p+1,k+1);
}
int main()
{int ch;
ifstream f("trie.in");
ofstream g("trie.out");
while (f>>ch)
{f>>cuv;
if(ch==0)
put(X,cuv+2);
if(ch==1)
dele(X,cuv+2);
if(ch==2)
g<<number(X,cuv+2);
if(ch==2)
g<<pref(X,cuv+2,0);
}
f.close();
g.close();
return 0;
}