Pagini recente » Cod sursa (job #480837) | Cod sursa (job #3291919) | Cod sursa (job #1423834) | Cod sursa (job #769827) | Cod sursa (job #2222162)
#include <fstream>
#include <cstring>
#define maxWordLength 20
struct node
{
int occurences;
struct node *edge[26];
node()
{
occurences = 0;
for(int i = 0; i < 26; i++)
{
edge[i] = NULL;
}
}
};
node *root = new node;
void Insert(char word[])
{
node *current = root;
int len = strlen(word), index;
for(int i = 0; i < len; ++i, current = current -> edge[index]){
index = word[i] - 'a';
if(current -> edge[index] == NULL)
{
current -> edge[index] = new node;
}
}
++(current -> occurences);
}
void Delete(char word[])
{
int len = strlen(word), index, it = -1, sons;
node *pathStack[maxWordLength + 1], *current = root;
pathStack[++it] = current;
for(int i = 0; i < len; ++i, current = current -> edge[index])
{
index = word[i] - 'a';
if(current -> edge[index] == NULL) return;
pathStack[++it] = current -> edge[index];
}
if(current -> occurences > 1)
{
--(current -> occurences);
return;
}
--(current -> occurences);
for(int i = it; i; --i)
{
sons = 0;
for(int j = 0; j < 26; ++j)
{
sons += !!(pathStack[i] -> edge[j]);
}
if(sons || pathStack[i] -> occurences) return;
else
{
delete pathStack[i];
pathStack[i - 1] -> edge[word[i - 1] - 'a'] = NULL;
}
}
}
int Search(char word[])
{
node *current = root;
int len = strlen(word), index;
for(int i = 0; i < len; ++i, current = current -> edge[index])
{
index = tolower(word[i]) - 'a';
if(current -> edge[index] == NULL) return 0;
}
return current -> occurences;
}
int LongestPrefix(char word[])
{
node *current = root;
int len = strlen(word), index, prefix = 0;
for(int i = 0; i < len; ++i, current = current -> edge[index])
{
index = word[i] - 'a';
if(current -> edge[index] == NULL) break;
++prefix;
}
return prefix;
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
int task; char word[21];
while(scanf("%d %s", &task, word) == 2)
{
switch(task)
{
case 0: Insert(word);
break;
case 1: Delete(word);
break;
case 2: printf("%d\n", Search(word));
break;
case 3: printf("%d\n", LongestPrefix(word));
break;
}
}
return 0;
}