Pagini recente » Cod sursa (job #2098919) | Cod sursa (job #949751) | Cod sursa (job #497467) | Cod sursa (job #1737133) | Cod sursa (job #2339766)
#include <fstream>
#include <string.h>
using namespace std;
ifstream fi("trie.in");
ofstream fo("trie.out");
const int lmax=20;
int q;
char w[lmax+5];
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==NULL)
{
nod->nr_cuv++;
return;
}
int delta=*cuv-'a';
if(nod->fii[delta]==NULL)
{
nod->fii[delta]=new nod_trie();
nod->nr_fii++;
}
add_word(nod->fii[delta], cuv+1);
}
int count_words(nod_trie* nod, char* cuv)
{
if(*cuv==NULL)
{
return nod->nr_cuv;
}
int delta=*cuv-'a';
if(nod->fii[delta]==NULL)
{
return 0;
}
count_words(nod->fii[delta], cuv+1);
}
int erase_word(nod_trie* nod, char* cuv)
{
if(*cuv==NULL)
{
nod->nr_cuv--;
if(nod->nr_cuv==0 && nod->nr_fii==0 && nod!=root)
{
delete nod;
return 1; /// s-a sters un nod
}
return 0; /// nu s-a sters nodul
}
int delta=*cuv-'a';
if(erase_word(nod->fii[delta], cuv+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 pref(nod_trie* nod, char* cuv)
{
if(*cuv==0)
return 0;
int delta=*cuv-'a';
if(nod->fii[delta]==0)
return 0;
return 1+pref(nod->fii[delta], cuv+1);
}
int main()
{
while(fi>>q)
{
fi>>w;
if(q==0)
{
add_word(root, w);
}
else if(q==1)
{
erase_word(root, w);
}
else if(q==2)
{
fo<<count_words(root, w)<<"\n";
}
else
{
fo<<pref(root, w)<<"\n";
}
}
fi.close();
fo.close();
return 0;
}