Pagini recente » Cod sursa (job #2381975) | Cod sursa (job #209651) | Cod sursa (job #1429710) | Cod sursa (job #1141075) | Cod sursa (job #2259782)
#include <bits/stdc++.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
const int ALPHABET_SIZE = 26;
struct TrieNode
{
struct TrieNode *children[ALPHABET_SIZE];
struct TrieNode *parent=NULL;
int wcnt;
};
struct TrieNode *getNode(void)
{
struct TrieNode *pNode = new TrieNode;
pNode->wcnt=0;
for(int i=0;i<ALPHABET_SIZE;i++)
pNode->children[i] = NULL;
return pNode;
}
void insert(struct TrieNode *root, string key)
{
struct TrieNode *node = root;
for(int i=0;i<key.length();i++)
{
int index=key[i]-'a';
if(!node->children[index])
node->children[index]=getNode(),
node->children[index]->parent=node;
node=node->children[index];
}
node->wcnt++;
}
bool freeNode(struct TrieNode *root)
{
for(int i=0;i<ALPHABET_SIZE;i++)
if(root->children[i]) return 0;
return 1;
}
bool erase(struct TrieNode *root, string key,int level=0)
{
if(key.size()==0) return 0;
if(root)
{
if(level==key.size())
{
if(root->wcnt)
{
root->wcnt--;
return freeNode(root);
}
}
}
else
{
int index=key[level]-'a';
if(erase(root->children[index],key,level+1))
{
delete root->children[index];
return root->wcnt!=0 && freeNode(root);
}
}
return 0;
}
int search(struct TrieNode *root,string key)
{
struct TrieNode *node = root;
for(int i=0;i<key.length();i++)
{
int index=key[i]-'a';
if(!node->children[index]) return false;
node=node->children[index];
}
return (node!=NULL)?node->wcnt : 0;
}
int count(struct TrieNode *root,string key)
{
struct TrieNode *node = root;
int result=0;
for(int i=0;i<key.length();i++)
{
int index=key[i]-'a';
if(!node->children[index]) return result;
node=node->children[index];
result++;
}
return result;
}
int main()
{
struct TrieNode *root = getNode();
int n; string w;
while(f>>n>>w)
{
switch(n)
{
case 0: insert(root,w); break;
case 1: erase (root,w); break;
case 2: g<<search(root,w)<<'\n'; break;
case 3: g<<count (root,w)<<'\n'; break;
}
}
return 0;
}