Pagini recente » Cod sursa (job #2697279) | Cod sursa (job #375278) | Cod sursa (job #782195) | Cod sursa (job #2424154) | Cod sursa (job #2222955)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
class Trie
{
Trie* next['z' - 'a' + 1];
int sufixe;
int exists;
int letterToIdx(char c)
{
return (int) c - 'a';
}
public:
Trie():
sufixe(0),
exists(0)
{
for(int i = 0; i <= 'z' - 'a'; ++i)
next[i] = NULL;
}
void add(char* s)
{
++sufixe;
if(*s == NULL)
++exists;
else
{
int idx = letterToIdx(*s);
if(next[idx] == NULL)
{
Trie *trie = new Trie();
next[idx] = trie;
trie->add(s + 1);
}
else
next[idx]->add(s + 1);
}
}
void remove(char *s)
{
--sufixe;
if(*s == NULL)
{
--exists;
return;
}
int letter = letterToIdx(*s);
if(next[letter] != NULL)
{
next[letter]->remove(s + 1);
if(next[letter]->sufixe == 0 && next[letter]->exists == 0)
{
Trie *p = next[letter];
next[letter] = NULL;
delete p;
}
}
}
int count(char *s)
{
if(*s == NULL)
return exists;
int idx = letterToIdx(*s);
if(next[idx] != NULL)
return next[idx]->count(s + 1);
else
return 0;
}
int prefixMax(char *s)
{
if(*s == NULL)
return 0;
int letter = letterToIdx(*s);
if(next[letter] != NULL)
return 1 + next[letter]->prefixMax(s + 1);
else
return 0;
}
};
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
Trie trie;
int op;
char s[21];
while(scanf("%d %s", &op, &s) == 2)
{
switch(op)
{
case 0:
trie.add(s);
break;
case 1:
trie.remove(s);
break;
case 2:
printf("%d\n", trie.count(s));
break;
case 3:
printf("%d\n", trie.prefixMax(s));
break;
default:
break;
}
}
return 0;
}