Pagini recente » Cod sursa (job #937365) | Cod sursa (job #977750) | Cod sursa (job #871998) | Cod sursa (job #3271866) | Cod sursa (job #418703)
Cod sursa(job #418703)
//#include <iostream>
#include <string>
#include <fstream>
std::ifstream fin("trie.in");
std::ofstream fout("trie.out");
struct trie
{
int words;
int prefixes;
trie* edges[26];
};
trie* shit;
void init(trie *& vertex)
{
vertex->words = 0;
vertex->prefixes = 0;
for (int i = 0; i < 26; ++i) vertex->edges[i] = NULL;
}
void addWord(trie *& vertex, std::string word)
{
vertex->prefixes++;
if (word.length() == 0) vertex->words++;
else
{
int k = word[0] - 'a';
if (!vertex->edges[k])
{
vertex->edges[k] = new trie;
init(vertex->edges[k]);
}
word.erase(0, 1);
addWord(vertex->edges[k], word);
}
}
int countWords(trie *& vertex, std::string word)
{
if (word.length() == 0) return vertex->words;
int k = word[0] - 'a';
if (!vertex->edges[k]) return 0;
word.erase(0, 1);
return countWords(vertex->edges[k], word);
}
bool deleteWord(trie *& vertex, std::string word)
{
if (word.length() == 0)
{
vertex->words--;
if (!vertex->words) vertex = NULL;
return 1;
}
int k = word[0] - 'a';
if (!vertex->edges[k]) return 0;
word.erase(0, 1);
bool ok = deleteWord(vertex->edges[k], word);
if (ok)
{
vertex->prefixes--;
if (!vertex->prefixes) vertex = NULL;
}
return ok;
}
void longestPrefix(trie *& vertex, std::string word, int &ret)
{
if (word.length() == 0) return;
int k = word[0] - 'a';
if (!vertex->edges[k]) return;
ret++;
word.erase(0, 1);
longestPrefix(vertex->edges[k], word, ret);
}
int main()
{
int reponse = 0;
std::string word;
shit = new trie;
init(shit);
int pref;
while (fin >> reponse)
{
if (reponse == 0)
{
fin >> word;
addWord(shit, word);
}
if (reponse == 2)
{
fin >> word;
fout << countWords(shit, word) << std::endl;
}
if (reponse == 1)
{
fin >> word;
deleteWord(shit, word);
}
if (reponse == 3)
{
fin >> word; pref = 0;
longestPrefix(shit, word, pref);
fout << pref << std::endl;
}
}
return 0;
}