Pagini recente » Cod sursa (job #1003933) | Cod sursa (job #1637115) | Cod sursa (job #3266239) | Cod sursa (job #2756992) | Cod sursa (job #570870)
Cod sursa(job #570870)
#include <stdio.h>
#include <string.h>
const char IN[]="trie.in",OUT[]="trie.out";
int count;
char s[30];
struct nod{
int cuv,nrEnd;
nod *next[26];
nod()
{
cuv=nrEnd=0;
memset(next,0,sizeof(next));
}
} *trie=new nod();
void insert(nod* trie,char *s)
{
while (*s!='\0')
{
if (!trie->next[*s-'a'])
trie->next[*s-'a']=new nod;
trie=trie->next[*s-'a'];
++trie->cuv;
++s;
}
++trie->nrEnd;
}
void erase(nod* trie,char *s)
{
while (*s!='\0' && trie)
{
trie=trie->next[*s-'a'];
--trie->cuv;
++s;
}
--trie->nrEnd;
}
int numCuv(nod* trie,char *s)
{
while (*s!='\0' && trie)
{
trie=trie->next[*s-'a'];
++s;
}
if (!trie)
return 0;
return trie->nrEnd;
}
int maxPref(nod* trie,char *s)
{
int ret=0;
while (trie->next[*s-'a'] && trie->next[*s-'a']->cuv>0 && *s!='\0')
{
++ret;
trie=trie->next[*s-'a'];
++s;
}
return ret;
}
int main()
{
int c;
freopen(IN,"r",stdin);
freopen(OUT,"w",stdout);
while (scanf("%d%s",&c,s)==2)
{
switch(c)
{
case 0:
insert(trie,s);
++trie->cuv;
++count;
break;
case 1:
erase(trie,s);
--trie->cuv;
--count;
break;
case 2:
printf("%d\n",numCuv(trie,s));
break;
case 3:
printf("%d\n",maxPref(trie,s));
break;
}
}
fclose(stdout);
fclose(stdin);
return 0;
}