Pagini recente » Cod sursa (job #1214801) | Cod sursa (job #222924) | Cod sursa (job #417162) | Cod sursa (job #2384630) | Cod sursa (job #418779)
Cod sursa(job #418779)
#include <iostream>
#include <fstream>
#define POS (s[0] - 'a')
std::ifstream fin("trie.in");
std::ofstream fout("trie.out");
struct trie
{
int words;
int prefixes;
trie* edges[26];
trie()
{
words = prefixes = 0;
memset(edges, NULL, sizeof(edges));
}
};
trie* shit;
char a[100];
void addWord(trie *& vertex, char *s)
{
vertex->prefixes++;
if (*s == NULL)
{
vertex->words++;
return;
}
if (!vertex->edges[POS]) vertex->edges[POS] = new trie;
addWord(vertex->edges[POS], s + 1);
}
int countWords(trie *& vertex, char *s)
{
if (*s == NULL) return vertex->words;
if (!vertex->edges[POS]) return 0;
return countWords(vertex->edges[POS], s + 1);
}
bool deleteWord(trie *& vertex, char *s)
{
if (*s == NULL)
{
vertex->words--; vertex->prefixes--;
if (!vertex->prefixes) delete vertex;
return 1;
}
if (!vertex->edges[POS]) return 0;
bool ok = deleteWord(vertex->edges[POS], s + 1);
if (ok)
{
vertex->prefixes--;
if (!vertex->prefixes) delete vertex;
}
return ok;
}
void longestPrefix(trie *& vertex, char *s, int &ret)
{
if (*s == NULL) return;
if (!vertex->edges[POS]) return;
ret++;
longestPrefix(vertex->edges[POS], s + 1, ret);
}
int main()
{
shit = new trie;
int pref;
char r;
while (fin >> r)
{
fin >> a;
switch (r)
{
case '0' : addWord(shit, a); break;
case '1' : deleteWord(shit, a); break;
case '2' : fout << countWords(shit, a) << std::endl; break;
case '3' :
{
pref = 0;
longestPrefix(shit, a, pref);
fout << pref << std::endl;
break;
}
}
}
return 0;
}