Pagini recente » Cod sursa (job #1653058) | Cod sursa (job #2299106) | Cod sursa (job #2405829) | Cod sursa (job #1836708) | Cod sursa (job #1189550)
#include <cstdio>
#include <cstring>
using namespace std;
struct trie
{
int v,sz;
trie *sons[26];
trie()
{
v = sz = 0;
memset(sons,0,sizeof(sons));
}
int find(char* c)
{
if ( *c == 0 )
return v;
if ( sons[int(*c)-int('a')] != NULL )
return sons[int(*c)-int('a')]->find(c+1);
else
return 0;
}
void add(char *c)
{
if ( *c == 0 )
{
v++;
sz++;
return;
}
if ( sons[int(*c)-int('a')] == NULL )
sons[int(*c)-int('a')] = new trie();
sz -= sons[int(*c)-int('a')]->sz;
sons[int(*c)-int('a')]->add(c+1);
sz += sons[int(*c)-int('a')]->sz;
}
void remove(char *c)
{
if ( *c == 0 )
{
v--;
sz--;
return;
}
if ( sons[int(*c)-int('a')]->sz == 0 )
sons[int(*c)-int('a')] = new trie();
else
{
sz -= sons[int(*c)-int('a')]->sz;
sons[int(*c)-int('a')]->remove(c+1);
sz += sons[int(*c)-int('a')]->sz;
if ( sons[int(*c)-int('a')]->sz == 0 )
sons[int(*c)-int('a')] = NULL;
}
}
int count(char *c,int now)
{
if ( *c == 0 )
return now;
if ( sons[int(*c)-int('a')] != NULL )
return sons[int(*c)-int('a')]->count(c+1,now+1);
else
return now;
}
};
const int size = 30;
trie *tree = new trie();
char c[size];
int type;
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
while ( ~scanf("%d %s\n",&type,c) )
{
if ( type == 0 ) tree->add(c);
if ( type == 1 ) tree->remove(c);
if ( type == 2 ) printf("%d\n",tree->find(c));
if ( type == 3 ) printf("%d\n",tree->count(c,0));
}
}