Pagini recente » Cod sursa (job #308961) | Cod sursa (job #2288302) | Cod sursa (job #1164165) | Cod sursa (job #2167718) | Cod sursa (job #1718122)
#include <bits/stdc++.h>
#define ch (*s-'a')
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct Trie{
int nr_fii;
int nr_cuv;
Trie *fiu[30];
Trie()
{
nr_fii=0;
nr_cuv=0;
memset(fiu,0,sizeof(fiu));
}
};
Trie *T = new Trie;
char s[30];
inline void Add(Trie *nod,char *s)
{
if(*s==0)
{
nod->nr_cuv++;
return;
}
if(nod->fiu[ch]==NULL)
{
nod->fiu[ch]= new Trie;
nod->nr_fii++;
}
Add(nod->fiu[ch],s+1);
}
inline bool Delete(Trie *nod,char *s)
{
if(*s==0)
nod->nr_cuv--;
else
if(Delete(nod->fiu[ch],s+1)==1)
{
nod->fiu[ch]=0;
nod->nr_fii--;
}
if(nod->nr_fii==0 && nod->nr_cuv==0 && nod!=T)
{
delete nod;
return 1;
}
return 0;
}
inline int Freq(Trie *nod, char *s)
{
if(*s==0)
return nod->nr_cuv;
if(nod->fiu[ch]!=0)
return Freq(nod->fiu[ch],s+1);
return 0;
}
inline int Prefix(Trie *nod,char *s,int lng)
{
if(*s==0 || nod->fiu[ch]==0)
return lng;
return Prefix(nod->fiu[ch],s+1,lng+1);
}
int main()
{
while(f.getline(s,30))
{
if(s[0]=='0')
Add(T,s+2);
if(s[0]=='1')
Delete(T,s+2);
if(s[0]=='2')
g<<Freq(T,s+2)<<"\n";
if(s[0]=='3')
g<<Prefix(T,s+2,0)<<"\n";
}
return 0;
}