Pagini recente » Cod sursa (job #2778543) | Cod sursa (job #1684819) | Cod sursa (job #2860494) | Cod sursa (job #367841) | Cod sursa (job #1675804)
#include <fstream>
#include <cstring>
#include <cstdio>
using namespace std;
char s[25];
struct node {
int nr = 0;
node *n[30];
node() {
memset(n, 0, sizeof(nr));
}
};
node *start = NULL, *p;
int N;
void add(node *&p, int i) {
if(p == NULL) p = new node;
if(i == N) {
p->nr ++;
return ;
}
add(p->n[s[i] - 'a'], i + 1);
}
bool del(node *&p, int i) {
if(i == N) {
p->nr --;
if(p->nr == 0) {
bool ok = false;
for(int j = 0; j < 26; j ++)
ok = ok | (p->n[j] != NULL);
if(!ok) p = NULL, delete(p);
return ok;
}
return true;
}
else {
if(!del(p->n[s[i] - 'a'], i + 1)) {
if(p->nr) return true;
bool ok = false;
for(int i = 0; i < 26; i ++)
ok = ok | (p->n[i] != NULL);
if(!ok) {
p = NULL;
delete(p);
}
return ok;
}
return true;
}
}
int nr(int i, node *p) {
if(p == NULL) return 0;
if(i == N) return p->nr;
return nr(i + 1, p->n[s[i] - 'a']);
}
int len(int i, node *p) {
if(p == NULL) return max(0, i - 1);
if(i == N) return i;
return len(i + 1, p->n[s[i] - 'a']);
}
int main()
{
ifstream f("trie.in");
ofstream g("trie.out");
int o;
start = new node;
while(f >> o >> s) {
N = strlen(s);
if(o == 0) add(start, 0);
else if(o == 1) del(start, 0);
else if(o == 2) g << nr(0, start) << "\n";
else if(o == 3) g << len(0, start) << "\n";
}
return 0;
}