Pagini recente » Cod sursa (job #1678589) | Cod sursa (job #1356253) | Cod sursa (job #2704717) | Cod sursa (job #2285955) | Cod sursa (job #1352800)
#include <cstdio>
#include <cstring>
using namespace std;
const int LAlfabet=28;
struct Trie
{
int Nr;
int NF;
Trie *fii[LAlfabet];
Trie()
{
Nr=0;
NF=0;
for (int i=0; i<=LAlfabet; i++) fii[i]=NULL;
}
};
char s[101];
void Insert(Trie *T, char *s)
{
if (*s==NULL) {T->Nr++; return;}
if (T->fii[s[0]-'a']==NULL)
{
T->fii[s[0]-'a']= new Trie;
T->NF++;
}
Insert(T->fii[s[0]-'a'], s+1);
}
void Remove(Trie *T, char *s)
{
if (*s==NULL) {T->Nr--;return;}
Remove(T->fii[s[0]-'a'], s+1);
if (T->fii[s[0]-'a']->Nr==0 && T->fii[s[0]-'a']->NF==0)
{
T->fii[s[0]-'a']=NULL;
T->NF--;
}
}
int Find(Trie *T, char *s)
{
if (T==NULL) return 0;
if (*s==NULL) return T->Nr;
Find(T->fii[s[0]-'a'], s+1);
}
int Prefix(Trie *T, char *s, int K)
{
if (*s==NULL || T->fii[s[0]-'a']==NULL) return K;
else return Prefix(T->fii[s[0]-'a'], s+1, K+1);
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
Trie *T= new Trie;
while (!feof(stdin))
{
int x;
char c;
memset(s,'\0',sizeof(s));
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;
}