Pagini recente » Cod sursa (job #2608041) | Cod sursa (job #1504088) | Cod sursa (job #724927) | Cod sursa (job #2420138) | Cod sursa (job #1846149)
#include <cstdio>
#include <cstring>
using namespace std;
struct trie
{
trie* next[26];
int fin, nr_cuv;
trie()
{
memset( next, '\0', sizeof(next) );
fin = 0;
nr_cuv = 0;
}
} *treeroot = new trie();
void insert( trie *node, char *str )//insert
{
++node->nr_cuv;
if( *str==0 )
{
++node->fin;
return;
}
if( !node->next[*str-'a'] )
{
node->next[*str-'a'] = new trie();
}
insert( node->next[*str-'a'], str+1 );
}
int fnd( trie *node, char *s )//find
{
if( !node )
{
return 0;
}
if( *s==0 )
{
return node->fin;
}
return fnd( node->next[*s-'a'], s+1 );
}
void dlt( trie *node, char *s )//delete
{
if( *s==0 )
{
--node->fin;
return;
}
dlt( node->next[*s-'a'], s+1 );
if( node->next[*s-'a']->nr_cuv > 1 )
{
--node->next[*s-'a']->nr_cuv;
}
else
{
delete node->next[*s-'a'];
node->next[*s-'a']= '\0';
}
}
int prefix( trie *node, char *s )
{
if( node->next[*s-'a']=='\0' )
{
return 0;
}
return 1 + prefix( node->next[*s-'a'], s+1 );
}
int main()
{
freopen( "trie.in", "r", stdin );
freopen( "trie.out", "w", stdout );
char s[26];
int x;
while( scanf( "%d%s", &x, s )!=EOF )
{
switch( x )
{
case 0:
insert( treeroot, s );
break;
case 1:
if( fnd( treeroot, s) )
{
dlt( treeroot, s );
}
break;
case 2:
printf( "%d\n", fnd( treeroot, s ) );
break;
case 3:
printf( "%d\n", prefix( treeroot, s ) );
break;
default:
printf("!");
}
}
return 0;
}