Pagini recente » Cod sursa (job #1341555) | Cod sursa (job #692295) | Cod sursa (job #1220393) | Cod sursa (job #2624710) | Cod sursa (job #2817370)
#include <bits/stdc++.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct trie{
int number, nrfii;
trie *children[26];
trie()
{
number = nrfii = 0;
memset(children, 0, sizeof(children));
}
};
trie *T = new trie;
void insert(trie *node, char *word)
{
if(!isalpha(*word))
{
node -> number++;
return;
}
int next = *word - 'a';
if(!(node -> children[next]))
node -> nrfii++, node -> children[next] = new trie;
insert(node -> children[next], word + 1);
}
bool del(trie *node, char *word)
{
int next = *word - 'a';
if(!isalpha(*word))
node -> number--;
else if(del(node -> children[next], word + 1))
{
node -> nrfii--;
node -> children[next] = 0;
}
if(node -> nrfii == 0 && node -> number == 0 && node != T)
{
delete node;
return true;
}
return false;
}
int occ(trie *node, char *word)
{
if(!isalpha(*word))
return node -> number;
if(node -> children[*word - 'a'])
return occ(node -> children[*word - 'a'], word + 1);
return 0;
}
int pref(trie *node, char *word, int k)
{
if(!isalpha(*word) || !(node -> children[*word - 'a']))
return k;
return pref(node -> children[*word - 'a'], word + 1, k + 1);
}
void read()
{
int x;
char word[21];
while(f>>x>>word)
{
if(!x)
insert(T, word);
else if(x == 1)
del(T, word);
else if(x == 2)
g<<occ(T, word)<<'\n';
else
g<<pref(T, word, 0)<<'\n';
}
}
int main()
{
read();
return 0;
}