Pagini recente » Cod sursa (job #2359329) | Cod sursa (job #919168) | Cod sursa (job #3132242) | Cod sursa (job #716388) | Cod sursa (job #2339761)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct nod_trie
{
int nr_cuv, nr_fii;
nod_trie* fii[26];
nod_trie()
{
nr_cuv=0;
nr_fii=0;
memset(fii,0,sizeof(fii));
}
};
nod_trie* root = new nod_trie();
void add_word(nod_trie* nod, char* cuv)
{
if(*cuv==0)
{
nod->nr_cuv++;
return;
}
int 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;
}
int delta=*cuv-'a';
if(nod->fii[delta]==0)
{
return 0;
}
search_word(nod->fii[delta],cuv+1);
}
int 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;
}
int 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)
{
int delta=*cuv-'a';
if(*cuv==NULL || nod->fii[delta]==NULL)
return 0;
else
return 1+prefix_length(nod->fii[delta],cuv+1);
}
short op;
char cuv[21];
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;
}