Pagini recente » Cod sursa (job #733134) | Cod sursa (job #1425354) | Cod sursa (job #2627441) | Cod sursa (job #149584) | Cod sursa (job #470801)
Cod sursa(job #470801)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int LG_LIN = 50;
struct trie
{
int cuv, nr_fii;
trie *fiu[26];
trie()
{
cuv = 0;
nr_fii = 0;
memset(fiu, 0, sizeof(fiu));
}
};
trie *T = new trie;
void insera(trie *nod, char *s)
{
if(*s == '\n')
{
nod->cuv++;
return;
}
else if(nod->fiu[*s - 'a'] == 0)
{
nod->fiu[*s - 'a'] = new trie;
nod->nr_fii++;
}
insera(nod->fiu[*s -'a'], s + 1);
}
int sterge(trie *nod, char *s)
{
if(*s == '\n')
nod->cuv--;
else if(sterge(nod->fiu[*s - 'a'], s + 1))
{
nod->fiu[*s - 'a'] = 0;
nod->nr_fii--;
}
if(nod->cuv == 0 && nod->nr_fii == 0 && nod != T)
{
delete nod;
return 1;
}
return 0;
}
int cuvant(trie *nod, char *s)
{
if(*s == '\n')
return nod->cuv;
if(nod->fiu[*s - 'a'])
return cuvant(nod->fiu[*s - 'a'], s + 1);
return 0;
}
int prefix(trie *nod, char *s, int k)
{
if(*s == '\n' || nod->fiu[*s - 'a'] == 0)
return k;
return prefix(nod->fiu[*s -'a'], s + 1, k + 1);
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
char line[LG_LIN];
fgets(line, sizeof(line), stdin);
while(!feof(stdin))
{
switch(line[0])
{
case '0': insera(T, line + 2);break;
case '1': sterge(T, line + 2);break;
case '2': printf("%d\n", cuvant(T, line + 2));break;
case '3': printf("%d\n", prefix(T, line + 2, 0));break;
}
fgets(line, sizeof(line), stdin);
}
return 0;
}