Pagini recente » Clasamentul arhivei educationale | Clasament de_la_inceput | Cod sursa (job #1394905) | Clasamentul arhivei Infoarena Monthly | Cod sursa (job #778062)
Cod sursa(job #778062)
#include <stdio.h>
#include <string.h>
typedef struct node {
int nrPrefix;
int nrWord;
node* next[26];
} NODE, *PNODE;
int op, wordSize;
char word[20];
PNODE root;
PNODE Insert(PNODE nod, int index);
PNODE Delete(PNODE nod, int index);
int Count(PNODE nod, int index);
int Prefix(PNODE nod, int index);
void FreeMemory(PNODE node);
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
root = new NODE;
for (int i = 0; i < 26; root->next[i] = NULL, i++);
scanf("%d %s", &op, word);
while (op != -1)
{
wordSize = strlen(word);
switch(op)
{
case 0: root->next[word[0]-'a'] = Insert(root->next[word[0]-'a'], 0); break;
case 1: root->next[word[0]-'a'] = Delete(root->next[word[0]-'a'], 0); break;
case 2: printf("%d\n", Count(root->next[word[0]-'a'], 0)); break;
default: printf("%d\n", Prefix(root->next[word[0]-'a'], 0)); break;
}
op = -1;
scanf("%d %s", &op, word);
}
FreeMemory(root);
return 0;
}
PNODE Insert(PNODE node, int index)
{
if (index == wordSize) return NULL;
if (node == NULL)
{
PNODE p = new NODE;
for (int i = 0; i < 26; p->next[i] = NULL, i++);
p->nrPrefix = 1;
if (index < wordSize-1)
{
p->next[word[index+1]-'a'] = Insert(p->next[word[index+1]-'a'], index+1);
p->nrWord = 0;
}
else
p->nrWord = 1;
return p;
}
else
{
node->nrPrefix++;
if (index < wordSize-1)
node->next[word[index+1]-'a'] = Insert(node->next[word[index+1]-'a'], index+1);
else
node->nrWord++;
return node;
}
}
PNODE Delete(PNODE node, int index)
{
if (index == wordSize) return NULL;
if (index < wordSize-1)
node->next[word[index+1]-'a'] = Delete(node->next[word[index+1]-'a'], index+1);
else
node->nrWord--;
node->nrPrefix--;
if (node->nrPrefix == 0)
{
delete node;
return NULL;
}
return node;
}
int Count(PNODE node, int index)
{
if (index == wordSize || node == NULL) return 0;
if (index == wordSize - 1)
return node->nrWord;
else
return Count(node->next[word[index+1]-'a'], index+1);
}
int Prefix(PNODE node, int index)
{
if (index == wordSize || node == NULL) return 0;
if (node->nrPrefix < 1) return 0;
if (index == wordSize - 1)
return 1;
else
return 1 + Prefix(node->next[word[index+1]-'a'], index+1);
}
void FreeMemory(PNODE node)
{
for (int i = 0; i < 26; i++)
if (node->next[i] != NULL)
FreeMemory(node->next[i]);
delete node;
}