Pagini recente » Cod sursa (job #1188896) | Cod sursa (job #2318856) | Cod sursa (job #479899) | Cod sursa (job #2473106) | Cod sursa (job #1164475)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct nod
{
int cnt, nrfii;
nod *fii[26];
nod()
{
cnt = nrfii = 0;
for (int i = 0; i < 26; ++i)
fii[i] = NULL;
}
} *r;
void add (nod *p, char *s);
int del (nod *p, char *s);
int nrap (nod *p, char *s);
int prefix (nod *p, char *s, int lg);
int main()
{
int cod;
char s[25];
r = new nod;
while (fin >> cod >> s)
{
if (cod == 0) add(r,s);
else if (cod == 1) del(r,s);
else if (cod == 2) fout << nrap(r,s)<<'\n';
else if (cod == 3) fout << prefix (r,s, 1) << '\n';
}
}
void add (nod* p, char *s)
{
if (*s == '\0')
{
++ p->cnt;
return;
}
else
{
if (p->fii[*s-'a'] == NULL)
{
nod *q = new nod;
++ p->nrfii;
p->fii[*s-'a'] = q;
}
add(p->fii[*s-'a'],s+1);
}
}
int del (nod* p, char* s)
{
if (*s == '\0')
-- p->cnt;
else
{
if (del( p->fii[*s-'a'], s+1))
{
-- p->nrfii;
delete p->fii[*s-'a'];
p->fii[*s-'a'] = NULL;
}
}
if (p->nrfii == 0) return 1;
return 0;
}
int nrap (nod *p, char *s)
{
if (*s == '\0') return p->cnt;
else
if (p->fii[*s-'a'] == NULL) return 0;
return nrap( p->fii[*s-'a'], s+1 );
}
int prefix (nod *p, char *s, int lg)
{
int rez;
if (*s == '\0')
return 0;
if (p->fii[*s-'a'] != NULL)
{
rez = prefix(p->fii[*s-'a'],s+1, lg+1);
if (p->nrfii > 1) return max(rez, lg);
}
}