Pagini recente » Cod sursa (job #2407533) | Cod sursa (job #2100698) | Cod sursa (job #730092) | Cod sursa (job #900847) | Cod sursa (job #788244)
Cod sursa(job #788244)
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
using namespace std;
#define ch (*s - 'a')
struct Trie
{
int cuv, nrfii;
Trie *fiu[31];
Trie()
{
cuv = nrfii = 0;
memset(fiu, 0, sizeof(fiu));
}
};
Trie *T = new Trie;
void Insert(Trie *nod, char *s)
{
if(*s == '\n')
{
nod -> cuv ++;
return ;
}
if(nod -> fiu[ch] == 0)
{
nod -> fiu[ch] = new Trie;
nod -> nrfii ++;
}
Insert(nod -> fiu[ch], s + 1);
}
int Delete(Trie *nod, char *s)
{
if(*s == '\n')
{
nod -> cuv --;
}else
{
if(Delete(nod -> fiu[ch], s + 1))
{
nod -> fiu[ch] = 0;
nod -> nrfii --;
}
}
if(nod -> cuv == 0 && nod -> nrfii == 0 && nod != T)
{
delete nod;
return 1;
}
return 0;
}
int Count(Trie *nod, char *s)
{
if(*s == '\n') return nod -> cuv;
if(nod -> fiu[ch]) return Count(nod -> fiu[ch], s + 1);
return 0;
}
int Prefix(Trie *nod, char *s, int k)
{
if(*s == '\n' || nod -> fiu[ch] == 0) return k;
return Prefix(nod -> fiu[ch], s + 1, k + 1);
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
char s[31];
fgets(s, 31, stdin);
while(!feof(stdin))
{
if(s[0] == '0') Insert(T, s + 2);
if(s[0] == '1') Delete(T, s + 2);
if(s[0] == '2') printf("%i\n", Count(T, s + 2));
if(s[0] == '3') printf("%i\n", Prefix(T, s + 2, 0));
fgets(s, 31, stdin);
}
return 0;
}