Pagini recente » Cod sursa (job #46644) | Cod sursa (job #875753)
Cod sursa(job #875753)
#include <cstdio>
#include <cstring>
#define C (*s-'a')
using namespace std;
char line[35];
int x;
struct trie
{
int pass;
int sons;
trie * fiu[26];
trie()
{
pass = sons = 0;
memset(fiu,0,sizeof(fiu));
}
};
trie * T = new trie;
void add(trie * nod,char *s)
{
while(*s != '\n')
{
if(nod->fiu[C]==0)
{
nod->fiu[C] = new trie;
nod->sons++;
}
nod = nod->fiu[C];
++s;
}
nod->pass++;
}
bool del(trie * nod,char *s)
{
if(*s == '\n')
nod->pass--;
else if(del(nod->fiu[C],s+1))
{
nod->fiu[C]=0;
nod->sons--;
}
/*
if(nod->sons == 0 && nod->pass == 0 && nod != T)
{
delete nod;
return 1;
}
*/
return 0;
}
int ap(trie * nod,char *s)
{
while(*s != '\n')
{
if(nod->fiu[C] == 0)
return 0;
nod = nod->fiu[C];
++s;
}
return nod->pass;
}
void pre(trie * nod,char *s)
{
while(nod->fiu[C] != 0 && *s != '\n')
{
nod = nod->fiu[C];
++x;
++s;
}
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
fgets(line,32,stdin);
while(!feof(stdin))
{
switch(line[0])
{
case '0' : add(T,line+2);break;
case '1' : del(T,line+2);break;
case '2' : printf("%d\n",ap(T,line+2));break;
case '3' : x=0;pre(T,line+2);printf("%d\n",x);break;
}
fgets(line,32,stdin);
}
return 0;
}