Pagini recente » Cod sursa (job #1248294) | Cod sursa (job #2736791) | Cod sursa (job #447931) | Cod sursa (job #66726) | Cod sursa (job #977259)
Cod sursa(job #977259)
#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;
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)
{
if (i==word.length()) {current->nr++; return;}
int letter=word[i]-'a';
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)
{
if (i==word.length()) 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==word.length()) 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==word.length()) 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;
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;
}