Pagini recente » Cod sursa (job #2294038) | Cod sursa (job #1937373) | Cod sursa (job #3137092) | Cod sursa (job #1653245) | Cod sursa (job #1731819)
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstring>
using namespace std;
struct Trie {
int cnt, nrfii;
Trie *fiu[26];
Trie(){
cnt = nrfii = 0;
memset (fiu, 0, sizeof(fiu));
}
};
Trie *root = new Trie;
void insert (Trie *node, char *word)
{
if (*word == '\n')
{
node->cnt ++;
return;
}
else if (node->fiu[*word-'a'] == 0)
{
node->fiu[*word-'a'] = new Trie;
node->nrfii++;
}
insert(node->fiu[*word-'a'], word+1);
}
int del (Trie *node, char *word)
{
if (*word == '\n')
{
node->cnt --;
}
else if (del (node->fiu[*word-'a'], word+1)){
node->fiu[*word-'a'] = 0;
node->nrfii --;
}
if (node->cnt == 0 && node->nrfii == 0 && node != root)
{
delete node;
return 1;
}
return 0;
}
int numApp (Trie* node, char* word)
{
if (*word == '\n')
return node->cnt;
if (node->fiu[*word - 'a'] == 0)
return 0;
return numApp(node->fiu[*word-'a'], word+1);
}
int prefix (Trie *node, char *word, int k)
{
if (*word == '\n' || node->fiu[*word-'a'] == 0)
{
return k;
}
else
return prefix (node->fiu[*word-'a'],word+1, k+1);
}
int main()
{
freopen ("trie.in","r", stdin);
freopen ("trie.out","w", stdout);
int type;
char line[32];
fgets(line, 32, stdin);
while (!feof(stdin))
{
switch (line[0])
{
case '0': insert(root, line+2);break;
case '1': del(root, line+2);break;
case '2': printf("%d\n", numApp(root, line+2));break;
case '3': printf("%d\n", prefix(root, line+2, 0));break;
}
fgets(line, 32, stdin);
}
return 0;
}