Pagini recente » Cod sursa (job #1875717) | Cod sursa (job #1785570) | Cod sursa (job #1120074) | Cod sursa (job #2765286) | Cod sursa (job #1347444)
#include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
int w;
char S[25];
struct trie{
int nr;
int nr_fii;
trie *f[26];
trie(){
nr = nr_fii = 0;
for(int i = 0; i < 26; i ++)
f[i] = 0;
}
} *r = new trie ();
void trie_insert(trie *nod, char *S){
if(*S == 0)
{
nod -> nr ++;
return ;
}
if(nod -> f[*S - 'a'] == 0){
nod -> f[*S - 'a'] = new trie;
nod -> nr_fii ++;
}
trie_insert(nod -> f[*S - 'a'], S + 1);
}
int trie_print_nr(trie *nod, char *S){
if(*S == 0){
return nod -> nr;
}
if(nod -> f[*S - 'a'] == 0){
return 0;
}
return trie_print_nr(nod -> f[*S - 'a'], S + 1);
}
int trie_print_prefix(trie *nod, char *S){
if(*S == 0)
return 0;
if(nod -> f[*S - 'a'] == 0)
return 0;
return 1 + trie_print_prefix(nod -> f[*S - 'a'], S + 1);
}
int trie_delete(trie *&nod, char *S){
if(*S == 0){
nod -> nr --;
if(nod -> nr_fii == 0 && nod -> nr == 0 && r != nod){
delete nod;
nod = 0;
return 1;
}
return 0;
}
if(trie_delete(nod ->f[*S - 'a'], S + 1) == 1){
nod -> nr_fii --;
if(nod -> nr_fii == 0 && nod -> nr == 0 && r != nod){
delete nod;
nod = 0;
return 1;
}
}
return 0;
}
int main()
{
while(fin >> w >> S)
if(w == 0)
{
trie_insert(r, S);
}
else
if(w == 1)
{
trie_delete(r, S);
}
else
if(w == 2)
{
fout << trie_print_nr(r, S) << '\n';
}
else
{
fout << trie_print_prefix(r, S) << '\n';
}
return 0;
}