Pagini recente » Cod sursa (job #1787213) | Cod sursa (job #278872) | Cod sursa (job #2074255) | Cod sursa (job #1964971) | Cod sursa (job #424718)
Cod sursa(job #424718)
#include <fstream>
#include <cstring>
using namespace std;
std::ifstream fin("trie.in");
std::ofstream fout("trie.out");
struct trie
{
int words;
int prefixes;
trie* edges[26];
};
trie* shit;
char a[100];
inline void init(trie *& vertex)
{
vertex->words = 0;
vertex->prefixes = 0;
memset(vertex->edges, 0, sizeof(vertex->edges));
}
inline void addWord(trie *& vertex, char *s)
{
vertex->prefixes++;
if (!*s) 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);
}
}
inline int countWords(trie *& vertex, char *s)
{
if (!*s) 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)
{
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) 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 >> r)
{
fin >> a;
switch (r)
{
case '0' : addWord(shit, a); break;
case '1' : deleteWord(shit, a); break;
case '2' : fout << countWords(shit, a) << '\n'; break;
case '3' :
{
pref = 0;
longestPrefix(shit, a, pref);
fout << pref << '\n';
break;
}
}
}
return 0;
}