Pagini recente » Cod sursa (job #244504) | Cod sursa (job #3220713) | Cod sursa (job #1572974) | Cod sursa (job #1505700) | Cod sursa (job #1917661)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie
{
int nrfii,nrcuv;
Trie *fiu[26];
Trie()
{
nrfii=nrcuv=0;
memset(fiu,0,sizeof(fiu));
}
};
Trie *root=new Trie;
char v[25];
void adauga(Trie *nod)
{
for(int i=0;;i++)
{
if(v[i]==0 || v[i]=='\n')
{
nod->nrcuv++;
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 || v[i]=='\n')
{
nod->nrcuv--;
}
else if( sterge(nod->fiu[ch],i+1)==1)
{
nod->nrfii--;
nod->fiu[ch]=0;
}
if(nod->nrcuv==0 && nod!=root && nod->nrfii==0)
{
delete nod;
return 1;
}
return 0;
}
int aparitii(Trie *nod)
{
for(int i=0;;i++)
{
if(nod==0) return 0;
if(v[i]==0 || v[i]=='\n') return nod->nrcuv;
nod=nod->fiu[ v[i]-'a' ];
}
}
int prefix(Trie *nod)
{
for(int i=0;;i++)
{
int ch=v[i]-'a';
if(v[i]==0 || v[i]=='\n' || nod->fiu[ch]==0) return i;
nod=nod->fiu[ch];
}
}
int main()
{
int x;
while(fin>>x>>v)
{
if(v[0]==0) break;
if(x==0) adauga(root);
if(x==1) sterge(root,0);
if(x==2) fout<<aparitii(root)<<"\n";
if(x==3) fout<<prefix(root)<<"\n";
memset(v,0,sizeof(v));
}
}