Pagini recente » Cod sursa (job #219447) | Cod sursa (job #2568169) | Cod sursa (job #796711) | Cod sursa (job #567690) | Cod sursa (job #1355507)
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct Trie
{
int inf , nrfii;
Trie *fiu[30];
Trie()
{
inf = nrfii = 0;
for (int i = 'a' - 'a'; i <= 'z' - 'a'; ++i)
fiu[i] = NULL;
}
};
Trie *T = new Trie;
int tip;
char cuvant[25];
void insert(Trie *T , char *s)
{
if (strlen(s) == 0)
{
T -> inf++;
return;
}
if (T -> fiu[*s - 'a'] == NULL)
{
T -> nrfii++;
T -> fiu[*s - 'a'] = new Trie;
}
insert(T -> fiu[*s - 'a'] , s + 1);
}
void erase(Trie *T , char *s)
{
if (strlen(s) == 0)
{
T -> inf--;
return;
}
erase(T -> fiu[*s - 'a'], s + 1);
if (T -> fiu[*s - 'a'] -> inf == 0 && T -> fiu[*s - 'a'] -> nrfii == 0)
{
T -> fiu[*s - 'a'] = NULL;
T -> nrfii --;
}
}
int numar_aparitii(Trie *T , char *s)
{
if (T == NULL) return 0;
if (strlen(s) == 0) return T -> inf;
return numar_aparitii(T -> fiu[*s - 'a'] , s + 1);
}
int longest_prefix(Trie *T , char *s)
{
if (strlen(s) == 0 || T -> fiu[*s - 'a'] == NULL) return strlen(s);
return longest_prefix(T -> fiu[*s - 'a'] , s + 1);
}
int main()
{
while (f >> tip)
{
f >> cuvant;
if (tip == 0) insert(T , cuvant);
if (tip == 1) erase(T , cuvant);
if (tip == 2) g << numar_aparitii(T , cuvant) << '\n';
if (tip == 3) g << strlen(cuvant) - longest_prefix(T , cuvant) << '\n';
}
return 0;
}