Pagini recente » Cod sursa (job #779045) | Cod sursa (job #970030) | Cod sursa (job #1736269) | Cod sursa (job #2296145) | Cod sursa (job #1189045)
#include<stdio.h>
#include<string.h>
#define Nmax 30
#define Lmax 26
class Trie;
int op;
char s[Nmax];
Trie *T;
class Trie
{
public:
Trie()
{
nrfii=0;
aparitii=0;
for (int i=0;i<Lmax;i++)
fii[i]=NULL;
}
~Trie()
{
}
void insert(char *s)
{
if (this->fii[*s-'a']==NULL && strlen(s))
{
this->nrfii++;
this->fii[*s-'a']=new Trie();
}
if (strlen(s)) this->fii[*s-'a']->insert(s+1);
else this->aparitii++;
}
void remove(char *s)
{
if (strlen(s))
{
this->fii[*s-'a']->remove(s+1);
if (this->fii[*s-'a']->aparitii==0 && this->fii[*s-'a']->nrfii==0 && this!=T)
{
this->fii[*s-'a']=NULL;
this->nrfii--;
}
}
else this->aparitii--;
}
int nrap(char *s)
{
if (this==NULL) return 0;
if (!strlen(s)) return this->aparitii;
return this->fii[*s-'a']->nrap(s+1);
}
int prefix(char *s,int k)
{
if (this->fii[*s-'a']==NULL || !strlen(s)) return k;
else return this->fii[*s-'a']->prefix(s+1,k+1);
}
private:
int nrfii,aparitii;
Trie *fii[Lmax];
};
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
T=new Trie();
while (1)
{
if (feof(stdin)) return 0;
scanf("%d %s\n",&op,s);
if (op==0) T->insert(s);
else if (op==1) T->remove(s);
else if (op==2) printf("%d\n",T->nrap(s));
else printf("%d\n",T->prefix(s,0));
}
}