Pagini recente » Cod sursa (job #2837765) | Cod sursa (job #3221608) | Cod sursa (job #1341529) | Cod sursa (job #3178457) | Cod sursa (job #1593127)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
char v[30];
struct Trie
{
int nrfii,nrcv;
Trie *fiu[26];
Trie()
{
nrfii=nrcv=0;
memset(fiu,0,sizeof(fiu));
}
};
Trie *Pr=new Trie; //radacina;
void adauga(Trie *nod)
{
for(int i=0;; i++)
{
if(v[i]==0) {nod->nrcv++;break;}
int CH=v[i]-'a';
if(nod->fiu[CH]==0)
{
nod->fiu[CH]=new Trie;
nod->nrfii++;
}
nod=nod->fiu[CH];
}
}
bool sterge(Trie *nod,int i)
{
int CH=v[i]-'a';
if(v[i]==0)
{
nod->nrcv--;
}
else if(sterge(nod->fiu[CH],i+1))
{
nod->fiu[CH]=0;
nod->nrfii--;
}
if(nod->nrcv==0&&nod!=Pr&&nod->nrfii==0) {delete nod;return 1;}
return 0;
}
int nr(Trie *nod)
{
for(int i=0;;i++)
{
int CH=v[i]-'a';
if(v[i]==0) return nod->nrcv;
nod=nod->fiu[CH];
}
}
int prefix(Trie *nod)
{
for(int i=0;;i++)
{ int CH=v[i]-'a';
if(v[i]==0||nod->fiu[CH]==0) return i;
nod=nod->fiu[CH];
}
}
int main()
{
int x;
while(fin>>x>>v)
{
if(x==0) adauga(Pr);
if(x==1) sterge(Pr,0);
if(x==2) fout<<nr(Pr)<<"\n";
if(x==3) fout<<prefix(Pr)<<"\n";
memset(v,0,sizeof(v));
}
}