Pagini recente » Cod sursa (job #2540637) | Cod sursa (job #2695776) | Cod sursa (job #1526527) | Cod sursa (job #2568980) | Cod sursa (job #1376793)
#include <cstdio>
#include <cstring>
using namespace std;
FILE *in, *out;
struct Trie {
int cnt, nrfii;
Trie *fii[26];
Trie()
{
cnt = nrfii = 0;
memset(fii, 0, sizeof(fii));
}
};
Trie *T = new Trie();
void add(Trie *nod, char* s)
{
if(*s == '\n' || *s == '\0')
{
nod->cnt++;
return;
}
if(nod->fii[*s-'a'] == 0)
{
nod->fii[*s-'a'] = new Trie();
nod->nrfii++;
}
add(nod->fii[*s-'a'], s+1);
}
bool sterg(Trie* nod, char *s)
{
if(*s == '\n' || *s == '\0')
{
nod->cnt--;
} else if(sterg(nod->fii[*s-'a'],s+1) == true)
{
nod->fii[*s-'a'] = 0;
nod->nrfii--;
}
if(nod->cnt == 0 && nod->nrfii == 0 && nod != T)
{
delete nod;
return true;
}
return false;
}
int query(Trie *nod, char *s)
{
if(*s == '\n' || *s == '\0')
return nod->cnt;
if(nod->fii[*s-'a'] > 0)
return query(nod->fii[*s-'a'], s+1);
return 0;
}
int prefix(Trie *nod, char *s, int lung)
{
if(*s == '\n' || *s == '\0' || nod->fii[*s-'a'] == 0)
return lung;
return prefix(nod->fii[*s-'a'], s+1, lung+1);
}
int main()
{
in = fopen("trie.in", "r");
out = fopen("trie.out","w");
char cuv[24];
fgets(cuv,24,in);
while(!feof(in))
{
if(cuv[0] == '0') add(T, cuv+2);
else if(cuv[0] == '1') sterg(T, cuv+2);
else if(cuv[0] == '2') fprintf(out, "%d\n", query(T, cuv+2));
else fprintf(out, "%d\n", prefix(T, cuv+2, 0));
fgets(cuv,24,in);
}
fclose(in);
fclose(out);
return 0;
}