Cod sursa(job #604616)
#include <iostream>
#include <string>
#define LMax 22
using namespace std;
struct Trie
{
int NSons;
int NWords;
Trie *Son[26];
Trie ()
{
NSons=0;
NWords=0;
memset (Son, NULL, sizeof (Son));
}
};
Trie *T=new Trie;
inline int Code (char C)
{
return ((int)C-(int)'a');
}
void Insert (Trie *Node, char *Letter)
{
if (*Letter=='\n')
{
++Node->NWords;
return;
}
int C=Code (*Letter);
if (Node->Son[C]==NULL)
{
++Node->NSons;
Node->Son[C]=new Trie;
}
Insert (Node->Son[C], Letter+1);
}
bool Delete (Trie *Node, char *Letter)
{
if (*Letter=='\n')
{
--Node->NWords;
}
else
{
int C=Code (*Letter);
if (Delete (Node->Son[C], Letter+1))
{
--Node->NSons;
Node->Son[C]=NULL;
}
}
if (Node->NSons==0 and Node->NWords==0 and Node!=T)
{
delete Node;
return true;
}
return false;
}
int Query (Trie *Node, char *Letter)
{
if (*Letter=='\n')
{
return Node->NWords;
}
int C=Code (*Letter);
if (Node->Son[C]==NULL)
{
return 0;
}
return Query (Node->Son[C], Letter+1);
}
int Prefix (Trie *Node, char *Letter, int L)
{
int C=Code (*Letter);
if (*Letter=='\n' or Node->Son[C]==NULL)
{
return L;
}
return Prefix (Node->Son[C], Letter+1, L+1);
}
int main()
{
freopen ("trie.in", "r", stdin);
freopen ("trie.out", "w", stdout);
int Type;
while (scanf ("%d", &Type)!=EOF)
{
char Word[LMax];
memset (Word, '\0', sizeof (Word));
scanf ("%s", &Word);
strcat (Word, "\n");
if (Type==0)
{
Insert (T, Word);
}
if (Type==1)
{
Delete (T, Word);
}
if (Type==2)
{
printf ("%d\n", Query (T, Word));
}
if (Type==3)
{
printf ("%d\n", Prefix (T, Word, 0));
}
}
return 0;
}