Pagini recente » Cod sursa (job #2771683) | Cod sursa (job #2176691) | Cod sursa (job #2033898) | Cod sursa (job #2728477) | Cod sursa (job #2058223)
#include<fstream>
#include<string.h>
using namespace std;
ifstream fi("trie.in");
ofstream fo("trie.out");
typedef struct trie
{
struct trie *fiu[26];
int ap,nrfii;
trie()
{
ap=nrfii=0;
memset(fiu,NULL,sizeof(fiu));
}
} NOD, *TRIE;
TRIE Trie;
void adauga(TRIE &T, char *p)
{
if((*p)=='\0')
{
T->ap++;
return;
}
if(T->fiu[(*p)-'a']==NULL)
{
T->fiu[(*p)-'a']=new NOD;
T->nrfii++;
}
adauga(T->fiu[(*p)-'a'],p+1);
}
bool del(TRIE &T, char *p)
{
if((*p)=='\0')
{
T->ap--;
if(T->ap==0 && T->nrfii==0)
{
delete(T);
return 1;
}
return 0;
}
else
{
bool val=del(T->fiu[(*p)-'a'],p+1);
if(val==1)
{
T->fiu[(*p)-'a']=NULL;
T->nrfii--;
}
if(T->ap==0 && T->nrfii==0 && T!=Trie)
{
delete(T);
return 1;
}
return 0;
}
}
int numara(TRIE T, char *p)
{
if((*p)=='\0')
return T->ap;
if(T->fiu[(*p)-'a']!=NULL)
return numara(T->fiu[(*p)-'a'],p+1);
return 0;
}
int prefix(TRIE T, char *p, int k)
{
if((*p)=='\0' || T->fiu[(*p)-'a']==NULL)
return k;
return prefix(T->fiu[(*p)-'a'],p+1,k+1);
}
int tip;
char S[25];
int main()
{
Trie=new NOD;
while(fi>>tip)
{
fi>>S;
if(tip==0)
adauga(Trie,S);
if(tip==1)
del(Trie,S);
if(tip==2)
fo<<numara(Trie,S)<<"\n";
if(tip==3)
fo<<prefix(Trie,S,0)<<"\n";
}
fi.close();
fo.close();
return 0;
}