Pagini recente » Cod sursa (job #1380943) | Cod sursa (job #345944) | Cod sursa (job #1662854) | Cod sursa (job #1216751) | Cod sursa (job #2277576)
#include <cstdio>
#include <cstring>
#include <cctype>
#define FILE_IN "trie.in"
#define FILE_OUT "trie.out"
struct trie
{
int len;
int drumuri;
trie *next[32];
trie()
{
memset(next, 0, sizeof(next));
len = drumuri = 0;
}
} start;
void modifica(char[], int);
int afis_count(char[]);
int afis_prefix(char[]);
int main()
{
freopen(FILE_IN, "r", stdin);
freopen(FILE_OUT, "w", stdout);
char str[32];
while(fgets(str, 32, stdin))
{
switch(str[0])
{
case '0':
{
modifica(str+2, +1);
break;
}
case '1':
{
modifica(str+2, -1);
break;
}
case '2':
{
printf("%i\n", afis_count(str+2));
break;
}
case '3':
{
printf("%i\n", afis_prefix(str+2));
break;
}
default: return 0;
}
}
return 0;
}
int afis_prefix(char str[])
{
int maxim = 0;
trie *p = &start;
for(int i = 0; isalpha(str[i]); ++i)
{
if(p->drumuri > 0)
maxim = i;
if(!p->next[str[i] - 'a'])
break;
p = p->next[str[i] - 'a'];
}
return maxim;
}
int afis_count(char str[])
{
trie *p = &start;
for(int i = 0; isalpha(str[i]); ++i)
{
if(!p->next[str[i] - 'a'])
return 0;
p = p->next[str[i] - 'a'];
}
return p->len;
}
void modifica(char str[], int semn)
{
trie *p = &start;
for(int i = 0; isalpha(str[i]); ++i)
{
if(!p->next[str[i] - 'a'])
p->next[str[i] - 'a'] = new trie;
p = p->next[str[i] - 'a'];
p->drumuri += semn;
}
p->len += semn;
}