Pagini recente » Cod sursa (job #1132227) | Cod sursa (job #1186725) | Cod sursa (job #252991) | Cod sursa (job #589947) | Cod sursa (job #233019)
Cod sursa(job #233019)
#include<stdio.h>
#include<string.h>
int op, k;
char sir[30];
struct TT{
int nr, fii;
TT *fiu[30];
TT(){
nr = fii = 0;
memset(fiu, 0, sizeof(fiu));
}
};
TT *A = new TT;
void adg(TT *q, int ind){
if (ind == k + 1){
q -> nr ++;
return ;
}
int i = sir[ind] - 'a';
if (q -> fiu[i] == 0){
q -> fiu[i] = new TT;
q -> fii ++;
}
adg(q -> fiu[i], ind + 1);
}
int str(TT *q, int ind){
if (ind == k + 1)
q -> nr --;
else
if (str(q -> fiu[sir[ind] - 'a'], ind + 1) == 1){
q -> fiu[sir[ind] - 'a'] = 0;
q -> fii --;
}
if (q -> nr == 0 && q -> fii == 0 && q != A){
delete q;
return 1;
}
return 0;
}
int find(TT *q, int ind){
if (ind == k + 1)
return q -> nr;
if (q -> fiu[sir[ind] - 'a'] != 0)
return find(q -> fiu[sir[ind] - 'a'], ind + 1);
return 0;
}
int prefix(TT *q, int ind, int nivel){
if (ind == k+1 || q -> fiu[sir[ind] - 'a'] == 0)
return nivel;
return prefix(q -> fiu[sir[ind] - 'a'], ind+1, nivel + 1);
}
int main()
{
freopen("trie.in", "rt", stdin);
freopen("trie.out", "wt", stdout);
while (scanf("%d %s", &op, sir+1) != EOF){
k = strlen(sir+1);
if (op == 0)
adg(A, 1);
if (op == 1)
str(A, 1);
if (op == 2)
printf("%d\n", find(A, 1));
if (op == 3)
printf("%d\n", prefix(A, 1, 0));
}
return 0;
}