Pagini recente » Cod sursa (job #2030265) | Cod sursa (job #2702509) | Cod sursa (job #2560508) | Cod sursa (job #371199) | Cod sursa (job #1153677)
#include <fstream>
#include <cstring>
#define ch (*s -'a')
using namespace std;
struct Trie
{
int nrfii,fr;
Trie *leg[26];
Trie()
{
nrfii=fr=0;
memset(leg, 0, sizeof(leg));
}
};
Trie *rad;
inline void Insert(Trie *nod, char *s)
{
if(*s=='\0')
{
nod->fr++;
return;
}
if(nod->leg[ch]==0)
{
nod->leg[ch]=new Trie;
nod->nrfii++;
}
Insert(nod->leg[ch],s+1);
}
inline int Search(Trie *nod, char *s)
{
if(*s=='\0')
return nod->fr;
if(nod->leg[ch]==0)
return 0;
return Search(nod->leg[ch],s+1);
}
inline int Delete(Trie *nod, char *s)
{
if(*s=='\0')
nod->fr--;
else
if(Delete(nod->leg[ch],s+1))
{
nod->nrfii--;
nod->leg[ch]=0;
}
if(nod->fr==0 && nod->nrfii==0 && nod!=rad)
{
delete nod;
return 1;
}
return 0;
}
inline int Prefix(Trie *nod, char *s, int lg)
{
if(*s=='\0' || nod->leg[ch]==0)
return lg;
return Prefix(nod->leg[ch],s+1,lg+1);
}
int main()
{
int x;
char sir[30];
ifstream fin ("trie.in");
ofstream fout ("trie.out");
rad= new Trie;
while(fin>>x>>sir)
{
if(!x)
Insert(rad,sir);
else
if(x==1)
Delete(rad,sir);
else
if(x==2)
fout<<Search(rad,sir)<<"\n";
else
fout<<Prefix(rad,sir,0)<<"\n";
}
fin.close();
fout.close();
return 0;
}