Pagini recente » Cod sursa (job #283113) | Cod sursa (job #1466561) | Cod sursa (job #2989301) | Cod sursa (job #2141797) | Cod sursa (job #2339798)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct nod_trie
{
int nr_cuv;
char nr_fii;
nod_trie* fii[26];
nod_trie()
{
nr_cuv=0;
nr_fii=0;
memset(fii,0,sizeof(fii));
}
};
short op;
char cuv[21];
nod_trie* root = new nod_trie();
void add_word(nod_trie* nod, char* cuv)
{
if(*cuv==0)
{
nod->nr_cuv++;
return;
}
char delta=*cuv-'a';
if(nod->fii[delta]==0)
{
nod->fii[delta]=new nod_trie();
nod->nr_fii++;
}
add_word(nod->fii[delta],cuv+1);
}
int search_word(nod_trie* nod, char* cuv)
{
if(*cuv==0)
return nod->nr_cuv;
char delta=*cuv-'a';
if(nod->fii[delta]==0)
return 0;
search_word(nod->fii[delta],cuv+1);
}
bool delete_word(nod_trie* nod, char* cuv)
{
if(*cuv==0)
{
nod->nr_cuv--;
if(nod->nr_cuv==0 && nod->nr_fii==0 && nod!=root)
{
delete nod;
return 1;
}
return 0;
}
char delta=*cuv-'a';
if(delete_word(nod->fii[delta],cuv+1)==1)
{
nod->nr_fii--;
nod->fii[delta]=0;
if(nod->nr_cuv==0 && nod->nr_fii==0 && nod!=root)
{
delete nod;
return 1;
}
}
return 0;
}
int prefix_length(nod_trie* nod, char* cuv)
{
char delta=*cuv-'a';
if(*cuv==0 || nod->fii[delta]==0)
return 0;
else
return 1+prefix_length(nod->fii[delta],cuv+1);
}
int main()
{
while(fin>>op)
{
fin>>cuv;
if(op==0) add_word(root,cuv);
else if(op==1) delete_word(root,cuv);
else if(op==2) fout<<search_word(root,cuv)<<'\n';
else fout<<prefix_length(root,cuv)<<'\n';
}
return 0;
}