Pagini recente » Cod sursa (job #2691596) | Cod sursa (job #800102) | Cod sursa (job #3177148) | Cod sursa (job #1734298) | Cod sursa (job #418774)
Cod sursa(job #418774)
#include <iostream>
#include <fstream>
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];
inline void addWord(trie *& vertex, char *s)
{
vertex->prefixes++;
if (*s == NULL) vertex->words++;
else
{
int k = s[0] - 'a';
if (!vertex->edges[k])
{
vertex->edges[k] = new trie;
}
addWord(vertex->edges[k], s + 1);
}
}
inline int countWords(trie *& vertex, char *s)
{
if (*s == NULL) return vertex->words;
int k = s[0] - 'a';
if (!vertex->edges[k]) return 0;
return countWords(vertex->edges[k], s + 1);
}
inline bool deleteWord(trie *& vertex, char *s)
{
if (*s == NULL)
{
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;
}
inline void longestPrefix(trie *& vertex, char *s, int &ret)
{
if (*s == NULL) return;
int k = s[0] - 'a';
if (!vertex->edges[k]) return;
ret++;
longestPrefix(vertex->edges[k], 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;
}