Pagini recente » Cod sursa (job #1849549) | Cod sursa (job #184097) | Cod sursa (job #1416743) | Cod sursa (job #658444) | Cod sursa (job #1317079)
#include<stdio.h>
#define ascii (int)'a'
#define FIN "trie.in"
#define FOUT "trie.out"
using namespace std;
typedef struct Trie
{
int children = 0;
int quantity = 0;
char value;
Trie* links[26];
} Trie;
Trie* myTrie = new Trie();
inline void op0(Trie* trie, char* word)
{
if(*word != '\n')
{
if(trie->links[(int)(*word)-ascii] != NULL)
{
trie->links[(int)(*word)-ascii]->children++;
op0(trie->links[(int)(*word)-ascii], word+1);
}
else
{
Trie* vertex = new Trie();
vertex->value = *word;
trie->links[(int)(*word) - ascii] = vertex;
op0(vertex, word+1);
}
}
else
{
trie->quantity++;
}
}
inline void op1(Trie* trie, char* word)
{
while(*word != '\n')
{
if(trie->links[(int)(*word)- ascii] != NULL && *(word+1) == '\n')
{
if(trie->links[(int)(*word)- ascii]->quantity > 1)
{
trie->links[(int)(*word)- ascii]->quantity--;
return;
}
else
{
delete trie->links[(int)(*word)- ascii];
trie->links[(int)(*word)- ascii] = NULL;
return;
}
}
if(trie->links[(int)(*word)- ascii] == NULL )
{
return;
}
else
{
trie = trie->links[(int)(*word)- ascii];
}
word++;
}
}
inline int op2(Trie* trie, char* word)
{
while(*word != '\n')
{
if(trie->links[(int)(*word)- ascii] == NULL)
{
return 0;
}
else
{
trie = trie->links[(int)(*word)- ascii];
}
word++;
}
return trie->quantity;
}
inline int op3(Trie* trie, char* word)
{
int count = 0;
while(*word != '\n')
{
if(trie->links[(int)(*word)- ascii] == NULL)
{
return count;
}
else
{
trie = trie->links[(int)(*word)- ascii];
}
count++;
word++;
}
return count;
}
int main()
{
char line[32];
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
fgets(line, 32, stdin);
while( !feof(stdin))
{
switch(line[0])
{
case '0':
op0(myTrie, line+2);
break;
case '1':
op1(myTrie, line+2);
break;
case '2':
printf("%d \n",op2(myTrie, line+2));
break;
case '3':
printf("%d \n", op3(myTrie,line+2));
break;
}
fgets(line, 32, stdin);
}
return 0;
}