Pagini recente » Cod sursa (job #3217346) | Cod sursa (job #1538795) | Cod sursa (job #2719316) | Cod sursa (job #349341) | Cod sursa (job #1945676)
#include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie
{
int cnt, fii;
Trie *fiu[30];
Trie()
{
fii=cnt=0;
for(int i=0; i<30; i++)
fiu[i]=0;
}
};
Trie *T=new Trie;
void add(Trie *nod, char *s)
{
if(*s=='\0')
{
nod->cnt++;
return;
}
if(!nod->fiu[*s-'a'])
{
nod->fiu[*s-'a']=new Trie;
nod->fii++;
}
add(nod->fiu[*s-'a'], s+1);
}
int del(Trie *nod, char *s)
{
if(*s=='\0')
nod->cnt--;
else if(del(nod->fiu[*s-'a'], s+1))
{
nod->fii--;
nod->fiu[*s-'a']=0;
}
if(nod->cnt==0 && nod->fii==0 && nod!=T)
{
delete nod;
return 1;
}
return 0;
}
int aparitii(Trie *nod, char *s)
{
if(*s=='\0')
return nod->cnt;
if(nod->fiu[*s-'a'])
return aparitii(nod->fiu[*s-'a'], s+1);
return 0;
}
int prefix(Trie *nod, char *s, int l)
{
if(*s=='\n' || !nod->fiu[*s-'a'])
return l;
return prefix(nod->fiu[*s-'a'], s+1, l+1);
}
int main()
{
char s[32];
int op;
while(fin>>op>>s)
{
if(op==0)
add(T, s);
else if(op==1)
del(T, s);
else if(op==2)
fout<<aparitii(T, s)<<'\n';
else if(op==3)
fout<<prefix(T, s, 0)<<'\n';
}
fin.close();
fout.close();
return 0;
}