Pagini recente » Cod sursa (job #2901941) | Cod sursa (job #2073833) | Cod sursa (job #39147) | Cod sursa (job #1176125) | Cod sursa (job #1637783)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie
{
int cnt, nrfii;
Trie *fiu[26];
Trie()
{
cnt=0;
nrfii=0;
for(int i=0;i<26;i++)
{
fiu[i]=0;
}
}
};
Trie *Root=new Trie;
void insrt(Trie *nod, char *c)
{
if(*c==0)
{
nod->cnt++;
return;
}
if(nod->fiu[*c-'a']==0)
{
nod->fiu[*c-'a']=new Trie;
nod->nrfii++;
}
insrt(nod->fiu[*c-'a'],c+1);
}
int nrap(Trie *nod, char *c)
{
if(*c==0)
{
return nod->cnt;
}
if(nod->fiu[*c-'a']==0)
return 0;
return nrap(nod->fiu[*c-'a'],c+1);
}
int del(Trie *nod, char *c)
{
if(*c==0)
{
nod->cnt--;
}
else
{
if(del(nod->fiu[*c-'a'],c+1))
{
nod->fiu[*c-'a']=0;
nod->nrfii--;
}
}
if(nod->nrfii==0&&nod->cnt==0&&nod!=Root)
{
delete nod;
return 1;
}
return 0;
}
int lung(Trie *nod, char *c, int k)
{
if(*c==0||nod->fiu[*c-'a']==0)
return k;
return lung(nod->fiu[*c-'a'],c+1,k+1);
}
int main()
{
int cer;
char w[25];
while(fin>>cer)
{
fin>>w;
if(cer==0)
{
insrt(Root,w);
}
if(cer==1)
{
del(Root,w);
}
if(cer==2)
{
fout<<nrap(Root,w)<<'\n';
}
if(cer==3)
{
fout<<lung(Root,w,0)<<'\n';
}
}
return 0;
}