Pagini recente » Cod sursa (job #376395) | Cod sursa (job #578805) | Cod sursa (job #2881347) | Cod sursa (job #401083) | Cod sursa (job #2807622)
#include <bits/stdc++.h>
#define oo 0x3f3f3f3f
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct trie
{
int ends, childrens;
trie *children['z' - 'a' + 1];
trie()
{
ends = childrens = 0;
memset(children, 0, sizeof(children));
}
};
trie *T = new trie;
void insert(trie *node, char *s)
{
if(!isalpha(*s))
{
node -> ends++;
return;
}
int next = *s - 'a';
if(!node -> children[next])
node -> childrens++, node -> children[next] = new trie;
insert(node -> children[next], s + 1);
}
bool del(trie *node, char *s)
{
if(!isalpha(*s))
node -> ends--;
else if(del(node -> children[*s - 'a'], s + 1))
{
node -> childrens--;
node -> children[*s - 'a'] = 0;
}
if(node -> ends == 0 && node -> childrens == 0 && node != T)
{
delete node;
return true;
}
return false;
}
int occ(trie *node, char *s)
{
if(!isalpha(*s))
return node -> ends;
if(node -> children[*s - 'a'])
return occ(node -> children[*s - 'a'], s + 1);
return 0;
}
int pre(trie *node, char *s, int len)
{
if(!isalpha(*s) || node -> children[*s - 'a'] == 0)
return len;
return pre(node -> children[*s - 'a'], s + 1, len + 1);
}
void read()
{
int op;
char s[21];
while(f>>op>>s)
{
switch(op)
{
case 0:
insert(T, s);
break;
case 1:
del(T, s);
break;
case 2:
g<<occ(T, s)<<'\n';
break;
case 3:
g<<pre(T, s, 0)<<'\n';
break;
}
}
}
int main()
{
read();
return 0;
}