Pagini recente » Cod sursa (job #3327785) | Cod sursa (job #1434316) | Cod sursa (job #1198279) | Cod sursa (job #3325663) | Cod sursa (job #1317724)
#include <iostream>
#include <fstream>
#include <string.h>
#define LMAX 27
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
int n, m;
struct nod {
int fii,nr;
nod *urm[LMAX];
nod() {
nr = 0;
fii = 0;
for(int i = 0; i <= 26; i++)
urm[i] = NULL;
}
} *rad;
char c[30];
int op;
void ins(nod *p) {
int i, lit;
for(i = 0; c[i] != '\0'; i++)
{
lit = c[i] - 'a';
if (!p->urm[lit])
{
p->urm[lit]=new nod();
p->fii++;
}
p = p->urm[lit];
}
p->nr++;
}
int del(nod *p, int i) {
if (c[i] == '\0') p->nr--;
else
{
int lit = c[i] - 'a';
if (del(p->urm[lit],i+1))
{
p->fii--;
p->urm[lit] = NULL;
}
}
if (p->fii == 0 && p->nr == 0 && p != rad)
{
delete p;
return 1;
}
return 0;
}
int tipareste_ap(nod *p) {
int i, lit;
for(i = 0; c[i] != '\0'; i++)
{
lit = c[i] - 'a';
if (!p->urm[lit])
return 0;
else
p = p->urm[lit];
}
return p->nr;
}
int tiparesteprefix(nod *p) {
int i, lit;
for(i = 0; c[i] != '\0'; i++)
{
lit = c[i] - 'a';
if (!p->urm[lit])
return i;
else
p = p->urm[lit];
}
return strlen(c);
}
int main()
{
rad = new nod;
while(in >> op >> c)
{
if (op == 0) ins(rad);
else if (op == 1) del(rad,0);
else if (op == 2) out << tipareste_ap(rad) << "\n";
else out << tiparesteprefix(rad) << "\n";
}
in.close();
out.close();
return 0;
}