Pagini recente » Cod sursa (job #1419422) | Cod sursa (job #2164742) | Cod sursa (job #875578) | Cod sursa (job #2164361) | Cod sursa (job #1066597)
/*
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 )
{
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 )
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 )
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 )
{
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");
int x;
char s[30];
while( fin >> x >> s )
{
// fscanf(f,"%d %s",&x,s);
//fin >> x >> s;
if( x == 0 )
AddWord(s,tree);
else if ( x == 2 )
//fprintf(g,"%d\n",PrintWordsNumber(s,tree));
fout << PrintWordsNumber(s,tree) << "\n";
else if ( x == 3 )
//fprintf(g,"%d\n",LongestPrefix(s,tree,0));
fout << LongestPrefix(s,tree,0) << "\n";
else if ( x == 1 )
DeleteWord(s,tree);
};
return 0;
}