Pagini recente » Cod sursa (job #2394744) | Cod sursa (job #1272994) | Cod sursa (job #449631) | Cod sursa (job #1972063) | Cod sursa (job #766679)
Cod sursa(job #766679)
#include <fstream>
#include <stdlib.h>
#include <iostream>
#include <string.h>
using namespace std;
struct trie {
int words;
int prefixes;
struct trie* edges[26];
};
typedef struct trie Trie;
void init (Trie **vertex) {
(*vertex) = (Trie*) calloc (1,sizeof(Trie));
/*(*vertex)->words = 0;
(*vertex)->prefixes = 0;
memset((void *)&(*vertex)->edges,'\0',sizeof((*vertex)->edges));*/
}
void add (Trie* vertex, string word, int position) {
if (word.length() == position) {
vertex->words++;
}
else
{
vertex->prefixes++;
int next_pos = word[position] % 26;
if (vertex->edges[next_pos] == NULL)
{
init (&vertex->edges[next_pos]);
}
add (vertex->edges[next_pos], word, ++position);
}
}
void remove (Trie* vertex, string word, int position)
{
int k;
if(word.length() != position)
{
vertex->prefixes--;
k = word[position]%26;
remove (vertex->edges[k], word, ++position);
if (vertex->edges[k]->prefixes == 0 && vertex->edges[k]->words == 0)
{
free(vertex->edges[k]);
vertex->edges[k] = NULL;
}
}
else
{
vertex->words--;
}
}
void print (Trie* vertex, string word, int position)
{
if (word.length() == position)
{
printf("%d\n", vertex->words);
}
else
{
int next_pos = word[position]%26;
if (vertex->edges[next_pos] != NULL)
{
print(vertex->edges[next_pos], word, ++position);
}
else
{
printf ("0\n");
}
}
}
void max_prefix(Trie* vertex, string word, int position)
{
if (word.length() == position)
{
printf("%d\n",position);
}
else
{
if (vertex->prefixes == 0)
{
if (vertex->words == 0)
{
printf("%d\n",position - 1);
}
else
{
printf("%d\n", position);
}
}
else
{
int next_pos = word[position] % 26;
if (vertex->edges[next_pos] != NULL)
{
max_prefix (vertex->edges[next_pos], word, ++position);
}
else
{
printf("%d\n",position);
}
}
}
}
int main() {
int x;
char text[21];
freopen("trie.in", "r", stdin);
freopen("trie.out","w",stdout);
Trie* firstVertex;
init (&firstVertex);
while (scanf("%d %s\n",&x, text)!= EOF)
{
switch (x) {
case 0 :
add (firstVertex, text, 0);
break;
case 1 :
remove (firstVertex, text, 0);
break;
case 2 :
print (firstVertex, text, 0);
break;
case 3 :
max_prefix (firstVertex, text, 0);
break;
}
}
}