Pagini recente » Cod sursa (job #845985) | Cod sursa (job #1840458) | Cod sursa (job #2395356) | Cod sursa (job #1916820) | Cod sursa (job #2269710)
#include <iostream>
#include <fstream>
#define ALPHABET 26
using namespace std;
ifstream fi("trie.in");
ofstream fo("trie.out");
struct Trie{
int words = 0;
int prefixes = 0;
Trie *edges[ALPHABET] = {0};
};
Trie * trie = new Trie;
char c[20];
int op;
void AddWord(Trie * t, char * c)
{
if(*c == '\0')
{
t->words++;
return;
}
else
{
if(t->edges[*c - 'a'] == NULL)
{
t->edges[*c - 'a'] = new Trie;
t->prefixes++;
}
AddWord(t->edges[*c - 'a'], c+1);
}
}
void DeleteWord(Trie * t, char * c)
{
if(*c == '\0')
t->words--;
else
{
DeleteWord(t->edges[*c - 'a'], c+1);
if(t->edges[*c - 'a']->words == 0 && t->edges[*c - 'a']->prefixes == 0)
{
delete t->edges[*c - 'a'];
t->prefixes--;
t->edges[*c - 'a'] = NULL;
}
}
}
int FindWord(Trie * t, char * c)
{
if(*c == '\0') return t->words;
if(t->edges[*c - 'a'] == NULL) return 0;
return FindWord(t->edges[*c - 'a'], c+1);
}
int FindPrefixes(Trie * t, char * c)
{
if(*c == '\0') return 0;
if(t->edges[*c - 'a'] == NULL) return 0;
return 1 + FindPrefixes(t->edges[*c - 'a'], c+1);
}
int main()
{
while(fi >> op)
{
fi>>c;
switch(op)
{
case 0: AddWord(trie, c); break;
case 1: DeleteWord(trie, c); break;
case 2: fo<<FindWord(trie, c)<<'\n'; break;
case 3: fo<<FindPrefixes(trie, c)<<'\n'; break;
}
}
fi.close();
fo.close();
}