Pagini recente » Cod sursa (job #2560286) | Cod sursa (job #564126) | Cod sursa (job #2796086) | Cod sursa (job #3149220) | Cod sursa (job #923709)
Cod sursa(job #923709)
#include <cstdio>
using namespace std;
const int N=100100;
struct TRIE
{
int val;
int pref;
TRIE *A[27];
}*trie;
void add(char cuv[21])
{
int poz=0;
TRIE *aux=new TRIE;
TRIE *aux2;
aux=trie;
while(cuv[poz]!='\0')
{
if(aux->A[cuv[poz]+1-'a']==0){
aux2=new TRIE;
aux2->val=0;
aux2->pref=0;
aux->A[cuv[poz]-'a'+1]=aux2;}
aux=aux->A[cuv[poz]-'a'+1];
aux->pref++;
if(cuv[poz+1]=='\0')
aux->val++;
++poz;
}
}
void del(char cuv[21])
{
int poz=0;
TRIE *aux;
aux=trie;
while(cuv[poz]!='\0'&&aux!=0)
{
aux=aux->A[cuv[poz]+1-'a'];
if(aux!=0){
aux->pref--;
if(cuv[poz+1]=='\0')
aux->val--;
}
poz++;
}
}
int apar(char cuv[21])
{
int poz=0;
TRIE *aux;
aux=trie;
while(cuv[poz]!='\0'&&aux!=0)
{
aux=aux->A[cuv[poz]+1-'a'];
if(aux!=0)
if(cuv[poz+1]=='\0')
return aux->val;
poz++;
}
}
int pref(char cuv[21])
{
int poz=0;
int maxx=0;
TRIE *aux;
aux=trie;
while(cuv[poz]!='\0'&&aux!=0)
{
aux=aux->A[cuv[poz]+1-'a'];
if(aux!=0)
if(aux->pref>0)
maxx++;
poz++;
}
return maxx;
}
void citire()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
trie=new TRIE;
int op;
char cuv[21];
while(scanf("%d%s",&op,&cuv)!=-1)
{
switch(op)
{
case 0:
add(cuv);
break;
case 1:
del(cuv);
break;
case 2:
printf("%d\n",apar(cuv));
break;
case 3:
printf("%d\n",pref(cuv));
break;
};
}
fclose(stdin);
fclose(stdout);
}
int main()
{
citire();
return 0;
}