Pagini recente » Cod sursa (job #2297852) | Istoria paginii planificare/sedinta-20081125 | Cod sursa (job #2648954) | Cod sursa (job #2883767) | Cod sursa (job #1577462)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
const int SIGMA = 26;
struct node {
node() {
words = sons = 0;
memset(son, 0, sizeof son);
}
int words, sons;
node* son[SIGMA];
};
node* root = new node;
char a[SIGMA];
void ins(node* nod, char* p) {
if (*p == '\0') {
nod->words++;
return;
}
if (nod->son[*p - 'a'] == 0) {
nod->son[*p - 'a'] = new node;
nod->sons++;
}
ins(nod->son[*p - 'a'], p + 1);
}
bool del(node* nod, char* p) {
if (*p == '\0')
nod->words--;
else {
if (del(nod->son[*p - 'a'], p + 1)) {
nod->son[*p - 'a'] = 0;
nod->sons--;
}
}
if (nod->words == 0 && nod->sons == 0 && nod != root) {
delete nod;
return 1;
}
return 0;
}
int numar(node* nod, char* p) {
if (*p == '\0') {
return nod->words;
}
if (nod->son[*p - 'a'])
return numar(nod->son[*p - 'a'], p + 1);
return 0;
}
int prefix(node* nod, char* p, int k) {
if (*p == '\0' || nod->son[*p - 'a'] == 0)
return k;
return prefix(nod->son[*p - 'a'], p + 1, k + 1);
}
int main()
{
while (fin.getline(a, SIGMA)) {
switch (a[0]) {
case '0': ins(root, a + 2); break;
case '1': del(root, a + 2); break;
case '2': fout << numar(root, a + 2) << '\n'; break;
case '3': fout << prefix(root, a + 2, 0) << '\n'; break;
}
}
return 0;
}