Pagini recente » Cod sursa (job #2812967) | Cod sursa (job #2849692) | Cod sursa (job #1034967) | Cod sursa (job #1372772) | Cod sursa (job #418760)
Cod sursa(job #418760)
#include <iostream>
#include <fstream>
std::ifstream fin("trie.in");
std::ofstream fout("trie.out");
struct trie
{
int words;
int prefixes;
trie* edges[26];
};
trie* shit;
char a[100];
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, char *s)
{
vertex->prefixes++;
if (*s == '\n') vertex->words++;
else
{
int k = s[0] - 'a';
if (!vertex->edges[k])
{
vertex->edges[k] = new trie;
init(vertex->edges[k]);
}
addWord(vertex->edges[k], s + 1);
}
}
int countWords(trie *& vertex, char *s)
{
if (*s == '\n') return vertex->words;
int k = s[0] - 'a';
if (!vertex->edges[k]) return 0;
return countWords(vertex->edges[k], s + 1);
}
bool deleteWord(trie *& vertex, char *s)
{
if (*s == '\n')
{
vertex->words--; vertex->prefixes--;
if (!vertex->prefixes) vertex = NULL;
return 1;
}
int k = s[0] - 'a';
if (!vertex->edges[k]) return 0;
bool ok = deleteWord(vertex->edges[k], s + 1);
if (ok)
{
vertex->prefixes--;
if (!vertex->prefixes) vertex = NULL;
}
return ok;
}
void longestPrefix(trie *& vertex, char *s, int &ret)
{
if (*s == '\n') return;
int k = s[0] - 'a';
if (!vertex->edges[k]) return;
ret++;
longestPrefix(vertex->edges[k], s + 1, ret);
}
int main()
{
shit = new trie;
init(shit);
int pref;
char r;
while (fin.getline(a, 100))
{
switch (a[0])
{
case '0' : addWord(shit, a + 2); break;
case '1' : deleteWord(shit, a + 2); break;
case '2' : fout << countWords(shit, a + 2) << std::endl; break;
case '3' :
{
pref = 0;
longestPrefix(shit, a + 2, pref);
fout << pref << std::endl;
break;
}
}
}
return 0;
}