Pagini recente » Cod sursa (job #2628177) | Cod sursa (job #2437002) | Cod sursa (job #540786) | Cod sursa (job #668108) | Cod sursa (job #1066598)
/*
Keep It Simple!
*/
#include<fstream>
#include<string.h>
struct node
{
int v,nr;
node *next[30];
node()
{
nr = v = 0;
memset(next,0,sizeof(next));
}
};
node *tree = new node;
void AddWord( char *s, node* crt )
{
if ( s[0] == 0 || *s == '\n' )
{
crt->v++;
return;
}
else
{
if(!crt->next[s[0]-'a'])
{
crt->next[s[0]-'a'] = new node;
crt->nr++;
}
AddWord(s+1,crt->next[s[0]-'a']);
}
}
int PrintWordsNumber( char *s, node* crt )
{
if ( s[0] == 0 || *s == '\n' )
return crt -> v;
else
{
if(!crt->next[s[0]-'a'])
return 0;
return PrintWordsNumber(s+1,crt->next[s[0]-'a']);
}
}
int LongestPrefix( char *s, node* crt, int level )
{
if ( s[0] == 0 || *s == '\n' )
return level;
else
{
if(!crt->next[s[0]-'a'])
return level;
return LongestPrefix(s+1,crt->next[s[0]-'a'],level+1);
}
}
void DeleteWord( char *s, node* crt)
{
if ( s[0] == 0 || *s == '\n' )
{
crt -> v--;
}
else
{
if(!crt->next[s[0]-'a'])
return;
DeleteWord(s+1,crt->next[s[0]-'a']);
}
if(crt->nr == 0 && crt->v == 0 && crt != tree)
delete crt;
}
int main()
{
//std::ifstream fin("trie.in");
//std::ofstream fout("trie.out");
//FILE *f = fopen("trie.in","r");
//FILE *g = fopen("trie.out","w");
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
int x;
char s[30];
//while( fin >> x >> s )
do
{
scanf("%d %s",&x,s);
// fin >> x >> s;
if( x == 0 )
AddWord(s,tree);
else if ( x == 2 )
printf("%d\n",PrintWordsNumber(s,tree));
// fout << PrintWordsNumber(s,tree) << "\n";
else if ( x == 3 )
printf("%d\n",LongestPrefix(s,tree,0));
// fout << LongestPrefix(s,tree,0) << "\n";
else if ( x == 1 )
DeleteWord(s,tree);
}while( !feof(stdin) );
return 0;
}