Pagini recente » Cod sursa (job #2556208) | Cod sursa (job #7118) | Cod sursa (job #2788153) | Rating Costel ICHB (costel_ichb) | Cod sursa (job #977264)
Cod sursa(job #977264)
#include <fstream>
#include <string>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie_node
{
int nr,sons;
trie_node *s[26];
trie_node ()
{
sons=0;
nr=0;
for (int i=0; i<26; i++) s[i]=NULL;
}
}*trie;
int len;
void add_word (trie_node *current, string word, int i)
{
if (i==len) {current->nr++; return;}
int letter=word[i]-'a';
if (current->s[letter]==NULL)
{
current->sons++;
current->s[letter]=new trie_node;
}
add_word (current->s[letter],word,i+1);
}
bool delete_word (trie_node *current, string word, int i)
{
if (i==len) current->nr--;
else {int letter=word[i]-'a'; if (delete_word (current->s[letter],word,i+1))
{
current->sons--;
current->s[letter]=NULL;
}}
if (current->nr==0 && current->sons==0 && current!=trie)
{delete current; return 1;}
return 0;
}
int search_word (trie_node *current, string word, int i)
{
if (i==len) return current->nr;
else {int letter=word[i]-'a'; if (current->s[letter]!=NULL) return search_word (current->s[letter],word,i+1);}
return 0;
}
int search_prefix (trie_node *current, string word, int i)
{
if (i==len) return 0;
int letter=word[i]-'a';
if (current->s[letter]==NULL) return 0;
return search_prefix (current->s[letter],word,i+1)+1;
}
int main()
{
trie= new trie_node;
int op;
string word;
while (fin>>op>>word)
{
len=word.length();
if (op==0) add_word (trie,word,0);
else if (op==1) delete_word (trie,word,0);
else if (op==2) fout<<search_word (trie,word,0)<<"\n";
else if (op==3) fout<<search_prefix (trie,word,0)<<"\n";
}
return 0;
}