Pagini recente » Cod sursa (job #1382634) | Cod sursa (job #1632892) | Cod sursa (job #1011888) | Cod sursa (job #3197980) | Cod sursa (job #1340532)
#include <fstream>
using namespace std;
ifstream is ("trie.in");
ofstream os ("trie.out");
struct Trie {
int countWords;
int countSons;
int isEnd;
Trie* sons[26];
} *head;
int type;
string word;
void AddWord();
bool DeleteWord(int i, Trie* node);
int FindWord();
int PreffixLength();
int main()
{
head = new Trie();
while(is >> type)
{
is >> word;
switch(type) {
case 0:
AddWord();
break;
case 1:
DeleteWord(0, head);
break;
case 2:
os << FindWord() << "\n";
break;
case 3:
os << PreffixLength() << "\n";
break;
}
}
is.close();
os.close();
return 0;
}
void AddWord()
{
int letter;
Trie *node = head;
for(int i = 0; i < word.size(); ++i)
{
letter = word[i] - 'a';
if(node->sons[letter] == 0)
{
node->countSons++;
node->sons[letter] = new Trie();
}
node = node->sons[letter];
}
node->isEnd++;
}
bool DeleteWord(int i, Trie* node)
{
if(i == word.size())
node->isEnd--;
else
{
int letter = word[i] - 'a';
if( DeleteWord(i+1, node->sons[letter]) )
{
node->countSons--;
node->sons[letter] = 0;
}
}
if(node->countSons == 0 && node->isEnd == 0 && node != head)
{
delete node;
return true;
}
else
return false;
}
int FindWord()
{
Trie* node = head;
for(int i = 0; i < word.size(); ++i)
{
if(node->sons[word[i]-'a'] == 0)
return 0;
node = node->sons[word[i]-'a'];
}
return node->isEnd;
}
int PreffixLength()
{
Trie* node = head;
for(int i = 0; i < word.size(); ++i)
{
if(node->sons[word[i]-'a'] == 0)
return i;
node = node->sons[word[i]-'a'];
}
return word.size();
}