Pagini recente » Istoria paginii runda/rar16 | Cod sursa (job #1017117) | Cod sursa (job #167039) | Cod sursa (job #1572572) | Cod sursa (job #1219451)
#include <cstdio>
#include <cstring>
#define lit *p - 'a'
using namespace std;
class Trie{
public:
int cuv,nrf;
Trie *fii[26];
Trie(){
memset(fii,0,sizeof(fii));
nrf = cuv = 0;
}
void Insert(char *p)
{
if(!*p){
++cuv;
return;
}
if(!fii[lit]){
fii[lit] = new Trie;
++nrf;
}
fii[lit]->Insert(p+1);
}
void Delete(char *p){
if(!*p){
--cuv;
return;
}
fii[lit]->Delete(p+1);
if(fii[lit]->nrf == 0 && fii[lit]->cuv == 0)
{
delete fii[lit];
fii[lit] = 0;
--nrf;
}
}
int Count(char *p){
if(!*p) return cuv;
if(!fii[lit]) return 0;
return fii[lit]->Count(p+1);
}
int Prefix(char *p){
if(!*p || !fii[lit])return 0;
return 1 + fii[lit]->Prefix(p+1);
}
}T;
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
int op;
char c[30];
while(scanf("%d",&op) != -1){
scanf("%s",c);
if(op == 0)
T.Insert(c);
else
if(op == 1)
T.Delete(c);
else
if(op == 2)
printf("%d\n",T.Count(c));
else
printf("%d\n",T.Prefix(c));
}
return 0;
}