Cod sursa(job #893385)
#include <iostream>
#include <fstream>
#include <cstring>
#include <iomanip>
#include <cstdio>
#define CH (*s-'a')
using namespace std;
char line[30];
struct Trie{
int nrfii,cuv;
Trie *fii[30];
Trie()
{
nrfii=cuv=0;
memset(fii,0,sizeof(fii));
}
};
Trie *T= new Trie;
void add(Trie *nod,char *s)
{
if(*s=='\0')
{
nod->cuv++;
return;
}
if(nod->fii[*s-'a'] == 0)
{
nod->fii[CH]=new Trie;
nod->nrfii++;
}
add(nod->fii[CH],s+1);
}
int del(Trie *nod, char *s)
{
if(*s=='\0')
nod->cuv--;
else if(del(nod->fii[CH],s+1))
{
nod->fii[CH]=0;
nod->nrfii--;
}
if(nod->cuv == 0 && nod->nrfii ==0 && nod!=T)
{
delete nod; return 1;
}
return 0;
}
int que(Trie *nod,char *s)
{
if(*s=='\0')
return nod->cuv;
if(nod->fii[CH])
return que(nod->fii[CH],s+1);
return 0;
}
int pre(Trie *nod,char *s,int k)
{
if(*s=='\0' || nod->fii[CH]==0)
return k;
return pre(nod->fii[CH],s+1,k+1);
}
int main()
{
ifstream fin("trie.in");
ofstream fout("trie.out");
int n;
while(fin>>n)
{
fin.getline(line,25);
switch(n){
case 0: add(T,line+1);break;
case 1: del(T,line+1);break;
case 2: fout<<que(T,line+1)<<'\n';break;
case 3: fout<<pre(T,line+1,0)<<'\n';break;
}
}
return 0;
}