Pagini recente » Cod sursa (job #1522885) | Cod sursa (job #2428631) | Cod sursa (job #1434846) | Cod sursa (job #2359942) | Cod sursa (job #2029874)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
const int SIGMA = 26; /// numarul literelor din alfabet
struct Trie {
Trie() {
numberOfWords = 0;
numberOfSons = 0;
memset(sons, 0, sizeof sons);
}
int numberOfWords, numberOfSons;
Trie* sons[SIGMA];
};
Trie *root = new Trie;
void addWord(Trie* trieNode, char* p) {
if (p[0] == 0) {
trieNode->numberOfWords++;
return;
}
if (trieNode->sons[p[0] - 'a'] == 0) {
trieNode->sons[p[0] - 'a'] = new Trie;
trieNode->numberOfSons++;
}
addWord(trieNode->sons[p[0] - 'a'], p + 1);
}
bool deleteWord(Trie* trieNode, char* p) {
if (p[0] == 0)
trieNode->numberOfWords--;
else {
if (deleteWord(trieNode->sons[p[0] - 'a'], p + 1)) {
trieNode->sons[p[0] - 'a'] = 0;
trieNode->numberOfSons--;
}
}
if (trieNode->numberOfWords == 0 && trieNode->numberOfSons == 0 && trieNode != root) {
delete trieNode;
return 1;
}
return 0;
}
inline int getNumber(Trie* trieNode, char *p) {
if (p[0] == 0)
return trieNode->numberOfWords;
if (trieNode->sons[p[0] - 'a'])
return getNumber(trieNode->sons[p[0] - 'a'], p + 1);
return 0;
}
inline int getPrefix(Trie* trieNode, char *p, int length) {
if (p[0] == 0 || trieNode->sons[p[0] - 'a'] == 0)
return length;
return getPrefix(trieNode->sons[p[0] - 'a'], p + 1, length + 1);
}
int main()
{
int op;
char word[21] = {0};
while (fin >> op >> word) {
switch (op) {
case 0: addWord(root, word); break;
case 1: deleteWord(root, word); break;
case 2: fout << getNumber(root, word) << '\n'; break;
case 3: fout << getPrefix(root, word, 0) << '\n'; break;
}
}
return 0;
}