Pagini recente » Cod sursa (job #3276766) | Cod sursa (job #69595) | Cod sursa (job #2990045) | Cod sursa (job #1899829) | Cod sursa (job #1637753)
#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;
}
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;
}