Pagini recente » Cod sursa (job #448720) | Cod sursa (job #2216528) | Cod sursa (job #1341122) | Cod sursa (job #390352) | Cod sursa (job #751052)
Cod sursa(job #751052)
#include <cstdio>
#include <cstring>
using namespace std;
struct Trie
{
int nr_cuv, nr_fii;
Trie *fiu[26];
Trie()
{
nr_cuv = 0, nr_fii = 0;
memset(fiu, 0, sizeof (fiu));
}
};
char line[32];
Trie *R = new Trie;
void add(Trie *nod, char *s)
{
if(*s == '\n')
{
nod -> nr_cuv++;
return;
}
if(nod -> fiu[*s - 'a'] == 0)
{
nod -> fiu[*s - 'a'] = new Trie;
nod -> nr_fii++;
}
add(nod -> fiu[*s - 'a'], s + 1);
}
int del(Trie *nod, char *s)
{
if(*s == '\n')
nod -> nr_cuv--;
else if(del(nod -> fiu[*s - 'a'], s + 1))
{
nod -> fiu[*s - 'a'] = 0;
nod -> nr_fii--;
}
if(!nod -> nr_cuv && !nod -> nr_fii && nod != R)
{
delete nod;
return 1;
}
return 0;
}
int query(Trie *nod, char *s)
{
if(*s == '\n')
return nod -> nr_cuv;
if(!nod -> fiu[*s - 'a'])
return 0;
return query(nod -> fiu[*s - 'a'], s + 1);
}
int prefix(Trie *nod, char *s, int lg)
{
if (*s == '\n' || !nod -> fiu[*s - 'a'])
return lg;
return prefix(nod -> fiu[*s - 'a'], s + 1, lg + 1);
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
fgets(line, 32, stdin);
while(!feof (stdin))
{
switch(line[0])
{
case '0': add(R, line + 2); break;
case '1': del(R, line + 2); break;
case '2': printf("%d\n", query(R, line + 2)); break;
case '3': printf("%d\n", prefix(R, line + 2, 0)); break;
}
fgets(line, 32, stdin);
}
return 0;
}