Pagini recente » Cod sursa (job #1740190) | Cod sursa (job #114576) | Cod sursa (job #1271791) | Cod sursa (job #1618659) | Cod sursa (job #2488285)
#include <cstdio>
#include <cstring>
using namespace std;
const int CUVMAX = 30;
char s[CUVMAX];
int n;
struct Trie {
int nrfii, nrcuv;
Trie *cuv[CUVMAX];
Trie() {
nrfii = nrcuv = 0;
for(int i = 0; i <= 28; i++) {
cuv[i] = 0;
}
}
};
Trie *a = new Trie;
void adauga(Trie *v, int p) {
if(p == n + 1) {
v->nrcuv++;
}
else {
int ch = s[p] - 'a';
if(v->cuv[ch] == 0) {
v->nrfii++;
v->cuv[ch] = new Trie;
}
adauga(v->cuv[ch], p + 1);
}
}
bool scoate(Trie *v, int p) {
if(p == n + 1) {
v->nrcuv--;
}
else if(scoate(v->cuv[s[p] - 'a'], p + 1) == 1) {
v->nrfii--;
v->cuv[s[p] - 'a'] = 0;
}
if(v->nrfii == 0 && v->nrcuv == 0 && v != a) {
delete v;
return 1;
}
return 0;
}
int cauta(Trie *v, int p) {
if(p == n + 1) {
return v->nrcuv;
}
else if(v->cuv[s[p] - 'a'] != 0){
return cauta(v->cuv[s[p] - 'a'], p + 1);
}
else {
return 0;
}
}
int prefix(Trie *v, int p) {
if(p == n + 1 || v->cuv[s[p] - 'a'] == 0) {
return p - 1;
}
else {
return prefix(v->cuv[s[p] - 'a'], p + 1);
}
}
int main() {
int op = -1;
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
scanf("%d", &op);
while(op != -1) {
scanf("%s", s + 1);
n = (int)strlen(s + 1);
if(op == 0) {
adauga(a, 1);
}
else if(op == 1) {
scoate(a, 1);
}
else if(op == 2) {
printf("%d\n", cauta(a, 1));
}
else {
printf("%d\n", prefix(a, 1));
}
memset(s, 0, sizeof(s));
op = -1;
scanf("%d", &op);
}
return 0;
}