Pagini recente » Cod sursa (job #2422453) | Cod sursa (job #1435449) | Cod sursa (job #2043224) | Cod sursa (job #1175948) | Cod sursa (job #809505)
Cod sursa(job #809505)
#include<stdio.h>
#include<cstdlib>
#include<string.h>
using namespace std;
struct Trie{
int val, cnt;
Trie *parent;
Trie* fii[26];
Trie(){
val = 0;
cnt = 0;
parent = NULL;
for (int i = 0; i < 26; i++){
fii[i] = NULL;
}
}
};
Trie *T = new Trie();
void adaugare(char c[20]){
int l = strlen(c);
// printf("aici");
Trie *Nod = T;
for(int i = 0; i < l; i++){
int j = c[i] - 'a';
if (Nod->fii[j] == NULL){
Trie *aux = new Trie();
if (i == l-1){
aux->val = 1;
}else{
aux->val = 0;
}
aux->parent = Nod;
Nod->fii[j] = aux;
Nod->cnt++;
//printf("cnt = %d val = %d\n", Nod->cnt, Nod->fii[j]->val);
}else{
if (i == l-1){
Nod->fii[j]->val++;
// printf("val = %d\n", Nod->fii[j]->val);
}
}
Nod = Nod->fii[j];
}
}
void stergere(char c[20]){
int l = strlen(c);
Trie *Nod = T;
Trie *Par = NULL;
for (int i = 0; i < l; i++){
int j = c[i] - 'a';
Nod = Nod->fii[j];
}
for(int i = l-1; i >= 0; i--){
Trie *aux = new Trie;
if (Nod->cnt > 0){
if (Nod->val > 0)
Nod->val--;
}else{
aux = Nod;
Nod = Nod->parent;
Nod->fii[c[i] - 'a'] = NULL;
Nod->cnt--;
//Nod->fii[];
delete aux;
}
}
}
int nraparitii(char c[20]){
int l = strlen(c);
Trie *aux = T;
for (int i = 0; i < l; i++){
int j = c[i] - 'a';
aux = aux->fii[j];
}
return aux->val;
}
int prefix(char c[20]){
int p = 0, l = strlen(c);
Trie *aux = T;
for (int i = 0; i < l && aux != NULL; i++){
int j = c[i] - 'a';
if (aux->fii[j] != NULL && aux->cnt > 1){
p = i + 1;
// printf("cnt = %d p = %d\n", aux->cnt, p);
}else if (aux->fii[j] == NULL){
p = i;
// printf("j = %d, cnt = %d, p = %d\n", j, aux->cnt, p);
}
aux = aux->fii[j];
}
return p;
}
int main(){
int q;
char s[20];
//printf("aici");
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
//int x = 3;
//printf("%d", x);
while(!feof(stdin)){
if(scanf("%d %s", &q, s) == EOF)
break;
// printf("q = %d\n", q);
if(q == 0)
adaugare(s);
if(q == 1)
stergere(s);
if(q == 2)
printf("%d\n", nraparitii(s));
if(q == 3)
printf("%d\n", prefix(s));
}
return 0;
}