Pagini recente » Cod sursa (job #1404970) | Cod sursa (job #2948131) | Cod sursa (job #269322) | Cod sursa (job #1895947) | Cod sursa (job #2026581)
#include <fstream>
using namespace std;
ifstream cin ("trie.in");
ofstream cout ("trie.out");
const int lit = 26;
struct node{
node(){
ap = 0;
pref = 0;
for (int i=0; i<lit; i++){
next[i] = NULL;
}
}
int ap;
int pref;
node *next [lit];
};
node *root = new node();
void add_word (node *prev , char *p){
if (*p == '\0'){
prev -> ap ++;
return;
}
if (prev -> next[*p - 97] == NULL){
prev -> next[*p - 97] = new node();
}
prev = prev -> next[*p - 97];
prev -> pref ++;
add_word (prev , p + 1);
}
void delete_word (node *prev , char *p){
if (*p == '\0'){
return;
}
node *old = prev;
prev = prev -> next[*p - 'a'];
prev -> pref --;
if (*(p + 1) == '\0'){
prev -> ap --;
if (prev -> pref == 0 && prev -> ap == 0){
delete prev;
old -> next[*p - 'a'] = NULL;
}
}
delete_word (prev , p + 1);
}
int ap_word (node *prev , char *p){
prev = prev -> next[*p - 97];
if (prev == NULL){
return 0;
}
if (*(p + 1) == '\0'){
return (prev -> ap);
}
return ap_word (prev , p + 1);
}
int pref_word (node *prev , char *p , int lung){
prev = prev -> next[*p - 97];
if (prev == NULL || prev -> pref == 0){
return lung;
}
if (*(p + 1) == '\0'){
return lung + 1;
}
return pref_word (prev , p + 1 , lung + 1);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int test;
char word[50];
while(cin>>test){
cin>>word;
if (test == 0){
add_word(root , word);
}
if (test == 1){
delete_word(root , word);
}
if (test == 2){
int ans = ap_word(root , word);
cout<<ans<<'\n';
}
if (test == 3){
int ans = pref_word(root , word , 0);
cout<<ans<<'\n';
}
}
return 0;
}