Pagini recente » Cod sursa (job #1999558) | Cod sursa (job #2199037) | Cod sursa (job #2428170) | Cod sursa (job #1150856) | Cod sursa (job #1945744)
#include <iostream>
#include <cstdio>
using namespace std;
int op;
char cuv[21];
struct TrieNode
{
int ap, nr;
TrieNode* copii[27];
TrieNode()
{
ap = 0;
nr = 0;
for(int i=0;i<27;i++)
copii[i] = NULL;
}
}*root;
void trie_insert(TrieNode* &node, char *p)
{
if(*p == 0)
{
node->ap++;
return;
}
if(node->copii[*p-'a'] == 0)
{
node->copii[*p-'a'] = new TrieNode;
node->nr++;
}
trie_insert(node->copii[*p-'a'],p+1);
}
bool trie_delete(TrieNode* &node, char *p)
{
if(!*p)
{
node->ap--;
}
else if(trie_delete(node->copii[*p-'a'],p+1))
{
node->copii[*p-'a'] = 0;
node->nr--;
}
if(node->ap == 0 && node->nr==0 && node !=root)
{
delete node;
return 1;
}
return 0;
}
int trie_longest_prefix(TrieNode* &node, char *p,int k)
{
if(!*p || !node->copii[*p-'a'])
return k;
//if(!node->copii[*p-'a'])
//return k;
return trie_longest_prefix(node->copii[*p-'a'],p+1,k+1);
}
int trie_count(TrieNode* &node, char *p)
{
if(!*p)
{
return node->ap;
}
if(node->copii[*p-'a'])
{
return trie_count(node->copii[*p-'a'],p+1);
}
return 0;
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
root = new TrieNode;
while(scanf("%d %s ",&op,cuv)==2)
{
switch(op)
{
case 0:
trie_insert(root,cuv);
break;
case 1:
trie_delete(root,cuv);
break;
case 2:
printf("%d\n",trie_count(root,cuv));
break;
case 3:
printf("%d\n",trie_longest_prefix(root,cuv,0));
break;
}
}
return 0;
}