Pagini recente » Cod sursa (job #2628016) | Cod sursa (job #2454379) | Cod sursa (job #2954277) | Cod sursa (job #1547154) | Cod sursa (job #1245601)
#include <iostream>
#include <vector>
#include <string.h>
using namespace std;
class Trie{
public:
int passing;
int finish;
Trie* alphabet[26];
Trie(){
passing = 0;
finish = 0;
for(int i = 0; i < 26; i++)
alphabet[i] = 0;
}
};
Trie *root;
void insertW(char *cuv, int len){
if(!root) {
root = new Trie;
}
Trie *t = root;
for(int i = 0; i < len; i++){
if(t->alphabet[cuv[i]-'a'] == 0){
t->alphabet[cuv[i]-'a'] = new Trie;
}
t->passing ++;
t = t->alphabet[cuv[i]-'a'];
}
t->finish ++;
t->passing ++;
}
void deleteW(char *cuv, int len){
Trie *t = root, *prev;
t->passing--;
prev = t;
for(int i = 0; i < len; i++){
t = t->alphabet[cuv[i]-'a'];
t->passing--;
prev = t;
}
t->finish--;
}
void how_many(char *cuv, int len){
Trie *t = root;
for(int i = 0; i < len; i++){
if(!t || !t->passing){
printf("0\n");
return ;
}
t = t->alphabet[cuv[i]-'a'];
}
(!t)? printf("0\n") : printf("%d\n", t->finish);
}
void prefix(char *cuv, int len){
Trie *t = root;
if(!t) { printf("0\n"); return ; }
for(int i = 0; i < len; i++){
t = t->alphabet[cuv[i]-'a'];
if(!t || !t->passing){
printf("%d\n", i);
return ;
}
}
printf("%d\n", len);
}
int main(){
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
char w[10000];
int op;
root = new Trie;
while(scanf("%d%s", &op, w) != EOF){
switch(op){
case 0: insertW(w, strlen(w)); break;
case 1: deleteW(w, strlen(w)); break;
case 2: how_many(w, strlen(w)); break;
case 3: prefix(w, strlen(w));
}
}
}