Pagini recente » Cod sursa (job #915345) | Cod sursa (job #948375) | Cod sursa (job #935255) | Cod sursa (job #683395) | Cod sursa (job #2280558)
#include <cstdio>
#define ch (*s - 'a')
using namespace std;
struct Trie{
Trie *leg[26];
int nrfii,fr;
Trie()
{
for(int i = 0 ; i < 26 ; i++)
leg[i] = 0;
fr = nrfii = 0;
}
};
Trie *rad = new Trie;
char s[30];
inline void Add(Trie *nod,char *s)
{
if(*s == '\0')
{
nod->fr++;
return;
}
if(nod->leg[ch] == 0)
{
nod->leg[ch] = new Trie;
nod->nrfii++;
}
Add(nod->leg[ch],s+1);
}
inline int Search(Trie *nod,char *s)
{
if(*s == '\0')
return nod->fr;
if(nod->leg[ch] == 0)
return 0;
return Search(nod->leg[ch],s+1);
}
inline int Lg(Trie *nod, char *s, int len)
{
if(*s=='\0' || nod->leg[ch]==0) return len;
return Lg(nod->leg[ch],s+1,len+1);
}
inline int Delete(Trie *nod, char *s)
{
if(*s=='\0')
nod->fr--;
else
if(Delete(nod->leg[ch],s+1))
{
nod->nrfii--;
nod->leg[ch]=0;
}
if(nod->nrfii==0 && nod->fr==0 && nod!=rad)
{
delete nod;
return true;
}
return false;
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
int tip,ok;
while(scanf("%d",&tip) != EOF)
{
scanf("%s\n",s);
if(!tip)
Add(rad,s);
else
if(tip==1)
ok=Delete(rad,s);
else
if(tip==2)
printf("%d\n",Search(rad,s));
else
printf("%d\n",Lg(rad,s,0));
}
return 0;
}