Pagini recente » Cod sursa (job #750811) | Cod sursa (job #1741464) | Cod sursa (job #2301532) | Cod sursa (job #779834) | Cod sursa (job #478883)
Cod sursa(job #478883)
#include <cstdio>
#include <cstring>
#include <string>
#define maxn 100010
#define W (*a - 'a')
struct TRIE
{
int fr, nrs;
TRIE *son[26];
TRIE ()
{
fr = 0; nrs = 0;
memset (son, 0, sizeof (son));
}
};
using namespace std;
TRIE *trie = new TRIE;
int sum;
char s[maxn];
void insert (TRIE *node, char *a)
{
if (*a == '\n') {
node -> fr++;
return ;
}
if (node -> son[W] == 0) {
node -> son[W] = new TRIE;
node -> nrs++;
}
insert (node -> son[W], a + 1);
}
bool del (TRIE *node, char *a)
{
if (*a == '\n')
node -> fr--;
else if (del (node -> son[W], a + 1)) {
node -> son[W] = 0;
node -> nrs--;
}
if (node -> fr == 0 && node -> nrs == 0 && node != trie) {
delete node; return 1;
}
return 0;
}
int query1 (TRIE *node, char *a)
{
if (*a == '\n')
return node -> fr;
else query1 (node -> son[W], a + 1);
}
int query2 (TRIE *node, char *a)
{
if (*a == '\n' || node -> son[W] == 0)
return sum;
sum += 1;
query2 (node -> son[W], a + 1);
}
int main ()
{
freopen ("trie.in", "r", stdin);
freopen ("trie.out", "w", stdout);
fgets (s, maxn, stdin);
while (!feof (stdin))
{
if (s[0] == '0') // insert
insert (trie, s + 2);
if (s[0] == '1') //erase
del (trie, s + 2);
if (s[0] == '2') //frequency
printf ("%d\n", query1 (trie, s + 2));
if (s[0] == '3') //lcp
sum = 0, printf ("%d\n", query2 (trie, s + 2));
fgets (s, maxn, stdin);
}
return 0;
}