Pagini recente » Cod sursa (job #3137919) | Cod sursa (job #2698227) | Cod sursa (job #1357756) | Cod sursa (job #2670692) | Cod sursa (job #769789)
Cod sursa(job #769789)
#include <iostream>
#define Length 26
using namespace std;
struct Trie
{
int word, prefix;
Trie *ramura[26];
Trie()
{
word = prefix = 0;
memset( ramura, 0, sizeof(ramura) );
}
};
void addWord(Trie *trie , char *word)
{
if (strcmp(word,"\0") == 0)
{
trie->word++;
return;
}
trie->prefix++;
short character = word[0] - 'a';
if (trie->ramura[character] == NULL)
trie->ramura[character] = new Trie;
strcpy(word, word+1);
addWord(trie->ramura[character], word);
}
int numberWords(Trie *trie, char *word)
{
if (strcmp(word, "\0") == 0)
return trie->word;
else
{
short character = word[0] - 'a';
if (trie->ramura[character] == NULL)
return 0;
strcpy(word, word+1);
return numberWords(trie->ramura[character], word);
}
}
int numberPrefixes(Trie *trie, char *word, int k)
{
if (strcmp(word, "\0") == 0)
return k;
else
{
short character = word[0] - 'a';
if (trie->ramura[character] == NULL || (trie->ramura[character]->prefix == 0 && trie->ramura[character]->word == 0))
return k;
strcpy(word, word+1);
return numberPrefixes(trie->ramura[character], word, k+1);
}
}
void deleteWord (Trie *trie, char *word)
{
if (strcmp(word, "\0") == 0)
{
trie->word--;
if (trie->prefix == 0 && trie->word == 0)
{
trie = NULL;
return;
}
}
else
{
trie->prefix--;
short character = word[0] - 'a';
strcpy(word, word+1);
deleteWord(trie->ramura[character], word);
}
}
void trieFunction()
{
Trie *trie = new Trie;
freopen ("trie.in", "r", stdin);
freopen ("trie.out", "w", stdout);
char number, word[20];
while (!cin.eof())
{
cin>>number>>word;
switch(number)
{
case '0': addWord(trie, word);
break;
case '1': char wordaux[20];
strcpy(wordaux, word);
if (numberWords(trie, wordaux) != 0)
deleteWord(trie, word);
break;
case '2': cout<<numberWords(trie, word)<<"\n";
break;
case '3': cout<<numberPrefixes(trie, word, 0)<<"\n";
break;
}
}
}
int main ()
{
trieFunction();
return 0;
}