Pagini recente » Cod sursa (job #1040007) | Cod sursa (job #1510271) | Cod sursa (job #237030) | Cod sursa (job #1256318) | Cod sursa (job #1637542)
#include <cstdio>
#include <cctype>
using namespace std;
const int lmx = 22;
struct nod {
nod *next[27];
int ap;
int fn;
} *St;
int cerinta,ls;
char s[lmx];
void initializare() {
St = new nod;
St->ap = 0;
St->fn = 0;
for(int i = 1; i <= 26; ++i)
St->next[i] = NULL;
}
void adaugare(nod *p, int l) {
if(not isalpha(s[l+1]))
return;
int i = (int)s[l+1] - 96;
if(not p->next[i]) {
p->next[i] = new nod;
p->next[i]->ap = 1;
p->next[i]->fn = 0;
for(int j = 1; j <= 26; ++j)
p->next[i]->next[j] = NULL;
if(s[l+2] < 'a' || s[l+2] > 'z')
p->next[i]->fn = 1;
} else {
++ p->next[i]->ap;
if(s[l+2] < 'a' || s[l+2] > 'z')
++ p->next[i]->fn;
}
adaugare(p->next[i],l+1);
}
void stergere(nod *p, int l) {
if(not isalpha(s[l+1]))
return;
int i = (int)s[l+1] - 96;
-- p->next[i]->ap;
if(s[l+2] < 'a' || s[l+2] > 'z')
-- p->next[i]->fn;
stergere(p->next[i],l+1);
}
void nr_aparitii(nod *p, int l){
int i = (int)s[l+1] - 96;
if(s[l+1] < 'a' || s[l+1] > 'z')
printf("%d\n", p->fn);
else if(p->next[i])
nr_aparitii(p->next[i],l+1);
else
printf("0\n");
}
void lungime_maxima(nod *p, int l){
int i = (int)s[l+1] - 96;
if(s[l+1] < 'a' || s[l+1] > 'z')
printf("%d\n", l);
else if(p->next[i] && p->next[i]->ap)
lungime_maxima(p->next[i],l+1);
else
printf("%d\n", l);
}
int main() {
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
initializare();
while(scanf("%d", &cerinta) != -1) {
scanf("%s", s + 1);
if(cerinta == 0) {
adaugare(St,0);
continue;
}
if(cerinta == 1) {
stergere(St,0);
continue;
}
if(cerinta == 2) {
nr_aparitii(St,0);
continue;
}
lungime_maxima(St,0);
}
return 0;
}