Pagini recente » Cod sursa (job #2828385) | Cod sursa (job #654836) | Cod sursa (job #501062) | Cod sursa (job #1464653) | Cod sursa (job #902560)
Cod sursa(job #902560)
#include<cstdio>
struct nod
{
int ap,fin;
nod *next[29];
};
nod *rad;
void add(char s[22],int ind,nod **nd)
{
if(s[ind]==NULL)return;
if(!*nd){*nd=new nod;(*nd)->ap=0;(*nd)->fin=0;for(int i=0;i<29;++i)(*nd)->next[i]=NULL;}
(*nd)->ap++;
if(s[ind+1]==NULL)
(*nd)->fin++;
else add(s,ind+1,&(*nd)->next[s[ind+1]-'a']);
}
void remove(char s[22],int ind,nod **nd)
{
if(s[ind]==NULL)return;
(*nd)->ap--;
if(s[ind+1]==NULL)(*nd)->fin--;
else remove(s,ind+1,&(*nd)->next[s[ind+1]-'a']);
}
int getAp(char s[22],int ind,nod *nd)
{
if(s[ind]==NULL)return 0;
if(!nd)return 0;
if(s[ind+1]==NULL)return nd->fin;
else getAp(s,ind+1,nd->next[s[ind+1]-'a']);
}
int getPref(char s[22],int ind,nod *nd,int max)
{
if(!nd)return max;
if(nd->ap>0)max++;
else return max;
if(s[ind+1]==NULL)return max;
else getPref(s,ind+1,nd->next[s[ind+1]-'a'],max);
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
rad=new nod;
for(int i=0;i<29;++i)rad->next[i]=NULL;
int c;
char s[22];
while(!feof(stdin))
{
scanf("%d %s\n",&c,&s);
if(c==0)add(s,0,&rad->next[s[0]-'a']);
if(c==1)remove(s,0,&rad->next[s[0]-'a']);
if(c==2)printf("%d\n",getAp(s,0,rad->next[s[0]-'a']));
if(c==3)printf("%d\n",getPref(s,0,rad->next[s[0]-'a'],0));
//scanf("%d %s\n",&c,&s);
}
return 0;
}