Pagini recente » Cod sursa (job #791851) | Cod sursa (job #2152740) | Cod sursa (job #3165540) | Cod sursa (job #1441618) | Cod sursa (job #1352514)
#include <cstdio>
using namespace std;
const int LAlfabet=28;
struct Trie
{
int NrApp;
int Nrfii;
Trie *fii[LAlfabet];
Trie()
{
NrApp=0;
Nrfii=0;
for (int i=0; i<=LAlfabet; i++) fii[i]=NULL;
}
};
char s[30];
void Insert(Trie *T, char *s)
{
if (*s==NULL) {T->NrApp++; return;}
if (T->fii[s[0]-'a']==NULL)
{
T->fii[s[0]-'a']= new Trie;
T->Nrfii++;;
}
Insert(T->fii[s[0]-'a'], s+1);
}
void Remove(Trie *T, char *s)
{
if (*s==NULL) {T->NrApp--;return;}
Remove(T->fii[s[0]-'a'], s+1);
if (T->fii[s[0]-'a']->NrApp==0 && T->fii[s[0]-'a']->Nrfii==0)
{
T->fii[s[0]-'a']=NULL;
T->Nrfii--;
}
}
int Find(Trie *T, char *s)
{
if (T==NULL) return 0;
if (*s==NULL) return T->NrApp;
Find(T->fii[s[0]-'a'], s+1);
}
int Prefix(Trie *T, char *s, int i)
{
if (*s==NULL || T->fii[s[0]-'a']==NULL) return i;
else return Prefix(T->fii[s[0]-'a'], s+1, i+1);
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
Trie *T= new Trie;
while (!feof(stdin))
{
int x;
char c;
scanf("%d%c", &x, &c);
gets(s);
if (*s==NULL) continue;
if (x==0) Insert(T, s);
if (x==1) Remove(T, s);
if (x==2) printf("%d\n", Find(T, s));
if (x==3) printf("%d\n", Prefix(T, s, 0));
}
return 0;
}