Pagini recente » Cod sursa (job #2950672) | Cod sursa (job #1723887) | Cod sursa (job #2094336) | Cod sursa (job #1363559) | Cod sursa (job #1737824)
#include <fstream>
#include <cstring>
#define ch (*s-'a')
using namespace std;
ifstream fi("trie.in");
ofstream fo("trie.out");
struct Trie{
int nr_fii;
int nr_cuv;
Trie *fiu[30];
Trie()
{
nr_fii=0;
nr_cuv=0;
memset(fiu,0,sizeof(fiu));
}
};
Trie *T = new Trie;
char s[30];
void adauga(Trie *nod,char *s)
{
if(*s==0)
{
nod->nr_cuv++; return;
}
if(nod->fiu[ch]==NULL)
{
nod->fiu[ch]= new Trie;
nod->nr_fii++;
}
adauga(nod->fiu[ch],s+1);
}
bool sterge(Trie *nod,char *s)
{
if(*s==0) nod->nr_cuv--;
else
if(sterge(nod->fiu[ch],s+1)==1)
{
nod->fiu[ch]=0;
nod->nr_fii--;
}
if(nod->nr_fii==0 && nod->nr_cuv==0 && nod!=T)
{
delete nod;
return 1;
}
return 0;
}
int aparitii(Trie *nod, char *s)
{
if(*s==0)
return nod->nr_cuv;
if(nod->fiu[ch]!=0)
return aparitii(nod->fiu[ch],s+1);
return 0;
}
int prefix(Trie *nod,char *s,int k)
{
if(*s==0 || nod->fiu[ch]==0)
return k;
return prefix(nod->fiu[ch],s+1,k+1);
}
int main()
{
while(fi.getline(s,30))
{
if(s[0]=='0')adauga(T,s+2);
if(s[0]=='1')sterge(T,s+2);
if(s[0]=='2')fo<<aparitii(T,s+2)<<"\n";
if(s[0]=='3')fo<<prefix(T,s+2,0)<<"\n";
}
return 0;
}