Pagini recente » Monitorul de evaluare | Cod sursa (job #2001799) | Cod sursa (job #906579) | Autentificare | Cod sursa (job #781689)
Cod sursa(job #781689)
#include<cstdio>
#include<cstring>
using namespace std;
char buff[30];
int intc;
struct trie
{int nr,nrfii;
trie* son[26];
trie()
{nr=0; nrfii=0;
for(int psi=0; psi<26; psi++)
son[psi]=0;}
};
trie *T=new trie;
void add(trie *nod, char *buff)
{if(*buff<'a' || *buff>'z')
{nod->nr++;
return;}
intc=*buff-'a';
if(nod->son[intc]==0)
{nod->son[intc]=new trie;
nod->nrfii++;}
add(nod->son[intc],buff+1);
}
int erase(trie *nod, char *buff)
{if(*buff<'a' || *buff>'z')
{nod->nr--;}
else
{intc=*buff-'a';
if(nod->son[intc])
if(erase(nod->son[intc],buff+1)==1)
{nod->son[intc]=0;
nod->nrfii--;}
}
if(nod->nr==0 && nod->nrfii==0 && nod!=T)
{delete nod;
return 1;}
return 0;
}
int count(trie *nod, char *buff)
{if(*buff<'a' || *buff>'z')
return nod->nr;
intc=*buff-'a';
if(nod->son[intc])
return count(nod->son[intc],buff+1);
return 0;
}
int prefix(trie *nod, char *buff,int grad)
{intc=*buff-'a';
if(*buff<'a' || *buff>'z' || nod->son[intc]==0)
return grad;
return prefix(nod->son[intc],buff+1,grad+1);
}
int main()
{freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
int caz;
while(gets(buff))
{
if(buff[0]=='0') add(T,buff+2); else
if(buff[0]=='1') erase(T,buff+2); else
if(buff[0]=='2') printf("%d\n",count(T,buff+2)); else
if(buff[0]=='3') printf("%d\n",prefix(T,buff+2,0));}
return 0;}