Pagini recente » Cod sursa (job #3122664) | Cod sursa (job #1534522) | Cod sursa (job #2826042) | Cod sursa (job #911481) | Cod sursa (job #2082786)
#include<fstream>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct trie
{
int fii;
int nr;
trie *fr[26];
trie()
{
fii=nr=0;
for(int i=0;i<26;i++)
fr[i]=0;
}
};
trie *root=new trie;
int n;
char a[25];
void adauga(trie *r, char *s)
{
if(*s==0)
r->nr ++;
else
{
if(r->fr[*s-'a'] ==0)
{
r->fii ++;
r->fr[*s-'a'] =new trie;
}
adauga(r->fr[*s-'a'], s+1);
}
}
void sterge(trie *&r, char *s)
{
if(*s==0)
{
r->nr --;
if(r->nr==0 && r->fii==0)
delete r;
r=NULL; //motivul pt care punem &r
}
else
{
sterge(r->fr[*s-'a'], s+1);
if(r->fr[*s-'a']==0) //daca mai are fii ??? //DACA *s ESTE FIU !!!
r->fii --; // ... //aici scazi numarul de fii in caz ca ala nu e ^^
if(r->nr==0 && r->fii==0)
{
delete r;
r=NULL;
}
}
}
int numara(trie *r, char *s)
{
if(*s==0)
return r->nr;
return numara(r->fr[*s-'a'], s+1);
}
int lungime(trie *r, char *s)
{
if(*s==0)
return 1;
if(r->fr[*s-'a']==0)
return 0;
return 1+lungime(r->fr[*s-'a'], s+1);
}
int main()
{
while(f>>n)
{
f>>a;
if(n==0)
adauga(root, a);
if(n==1)
sterge(root, a);
if(n==2)
g<<numara(root, a)<<"\n";
if(n==3)
g<<lungime(root, a)<<"\n";
}
return 0;
}