Pagini recente » Cod sursa (job #3288053) | Cod sursa (job #1410249) | Cod sursa (job #758184) | Cod sursa (job #489239) | Cod sursa (job #872709)
Cod sursa(job #872709)
#include <fstream>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct Trie {
Trie();
void addWord(char*);
bool delWord(char*);
int countWords(char*);
int lcp(char*, int);
private:
int words;
int prefixes;
Trie* edges[26];
static Trie* top;
};
Trie* Trie::top = NULL;
Trie::Trie()
{
if (top == NULL) top = this;
words = prefixes = 0;
for (int i = 0; i < 26; i++) edges[i] = NULL;
}
void Trie::addWord(char* word)
{
if (word[0] == '\0')
words += 1;
else
{
prefixes += 1;
int k = word[0]; k -= 97;
if (edges[k] == NULL)
edges[k] = new Trie;
edges[k]->addWord(word+1);
}
}
bool Trie::delWord(char* word)
{
int k = word[0]; k -= 97;
if (word[0] == '\0')
words--;
else if (edges[k]->delWord(word+1))
{
edges[k] = NULL;
prefixes--;
}
if (words == 0 && prefixes == 0 && this != top)
{
delete this;
return true;
}
return false;
}
int Trie::countWords(char* word)
{
int k = word[0]; k -= 97;
if (word[0] == '\0')
return words;
else if (edges[k] == NULL)
return 0;
else
return edges[k]->countWords(word+1);
}
int Trie::lcp(char* word, int c)
{
int k = word[0]; k -= 97;
if (word[0] == '\0' || edges[k] == 0)
return c;
return edges[k]->lcp(word+1, c+1);
}
int main()
{
char wr[22]; int op; Trie tr;
while ((in >> op, in >> wr) && !in.eof())
{
switch (op)
{
case 0: tr.addWord(wr); break;
case 1: tr.delWord(wr); break;
case 2: out << tr.countWords(wr) << '\n'; break;
case 3: out << tr.lcp(wr, 0) << '\n'; break;
}
}
return 0;
}