Pagini recente » Cod sursa (job #1209087) | Cod sursa (job #1551549) | Cod sursa (job #1892556) | Cod sursa (job #1001307) | Cod sursa (job #1318175)
#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;
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)
{
op0(trie->links[(int)(*word)-ascii], word+1);
}
else
{
Trie* vertex = new Trie();
trie->children++;
trie->links[(int)(*word) - ascii] = vertex;
op0(vertex, word+1);
}
}
else
{
trie->quantity++;
}
}
inline void op1(Trie* trie, char* word)
{
Trie* del = new Trie();
int pos = 0;
while(*word != '\n')
{
if(trie)
{
if(trie->links[(int)(*word) - ascii] != NULL)
{
if(trie->links[(int)(*word) - ascii]->children > 1)
{
del = trie->links[(int)(*word) - ascii];
pos = (int)(*(word+1))-ascii;
}
}
trie = trie->links[(int)(*word) - ascii];
word++;
}
}
if(trie != NULL)
{
if(trie->quantity > 1)
{
trie->quantity--;
}
else
{
if(del->links[pos] && del)
{
delete (del->links[pos]);
del->links[pos] = NULL;
del->children--;
}
}
}
}
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++;
}
if(trie)
return trie->quantity;
else return 0;
}
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];
myTrie->children = 1;
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;
}