Pagini recente » Cod sursa (job #1993638) | Cod sursa (job #2828289) | Cod sursa (job #2601099) | Cod sursa (job #3294946) | Cod sursa (job #977258)
Cod sursa(job #977258)
#include <fstream>
#include <string>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie_node
{
int nr,sons;
trie_node *s[29];
}*trie;
void initialize (trie_node *node)
{
node->sons=0;
node->nr=0;
for (int i=0; i<26; i++) node->s[i]=NULL;
}
void add_word (trie_node *current, string word, int i)
{
int letter = word[i]-'a';
if (i==word.length()) {current->nr++; return;}
if (current->s[letter]==NULL)
{
current->sons++;
current->s[letter]=new trie_node;
initialize (current->s[letter]);
}
add_word (current->s[letter],word,i+1);
}
bool delete_word (trie_node *current, string word, int i)
{
int letter=word[i]-'a';
if (i==word.length()) current->nr--;
else 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)
{
int letter=word[i]-'a';
if (i==word.length()) return current->nr;
else 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)
{
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;
initialize (trie);
int op;
string word;
while (fin>>op>>word)
{
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;
}