Cod sursa(job #1800405)

Utilizator alittlezzCazaciuc Valentin alittlezz Data 7 noiembrie 2016 19:17:02
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.22 kb
#include <fstream>
#include <iostream>
#include <string.h>

using namespace std;

char buffer[25];

class Trie{
    public:
        int ap;
        int sf;
        Trie *node[26];
        Trie();
};
Trie *root = new Trie;

Trie::Trie(){
    ap = 0;
    sf = 0;
    for(int i = 0;i < 26;i++){
        node[i] = NULL;
    }
}

void add(){
    int n = strlen(buffer + 1);
    int i;
    Trie *p = root;
    for(i = 1;i <= n;i++){
        if(p->node[buffer[i] - 'a'] == NULL){
            Trie *ax = new Trie;
            p->node[buffer[i] - 'a'] = ax;
        }
        p = p->node[buffer[i] - 'a'];
        p->ap++;
        if(i == n){
            p->sf++;
        }
    }
}

void dfs(Trie *p, int depth, int n){
    if(depth > n){
        return;
    }
    p->ap--;
    if(depth == n){
        p->sf--;
    }
    if(depth < n){
        dfs(p->node[buffer[depth + 1] - 'a'], depth + 1, n);
        if(p->node[buffer[depth + 1] - 'a']->ap == 0){
            delete p->node[buffer[depth+1] - 'a'];
            p->node[buffer[depth+1] - 'a'] = NULL;
        }
    }
}

int countAp(){
    int n = strlen(buffer + 1);
    int i;
    Trie *p = root;
    for(i = 1;i <= n;i++){
        if(p->node[buffer[i] - 'a'] != NULL){
            p = p->node[buffer[i] - 'a'];
        }else{
            return 0;
        }
    }
    return p->sf;
}

int calculatePref(){
    int n = strlen(buffer + 1);
    int i;
    Trie *p = root;
    for(i = 1;i <= n;i++){
        if(p->node[buffer[i] - 'a'] != NULL){
            p = p->node[buffer[i] - 'a'];
        }else{
            break;
        }
    }
    return i-1;
}

int main(){
    ifstream fin("trie.in");
    ofstream fout("trie.out");
    int x;
    for(;fin>>x, fin>>buffer+1;){
        if(x == 0){
            add();
        }else if(x == 1){
            dfs(root->node[buffer[1] - 'a'], 1, strlen(buffer + 1));
            if(root->node[buffer[1]-'a']->ap == 0){
                delete root->node[buffer[1] - 'a'];
                root->node[buffer[1]-'a'] = NULL;
            }
        }else if(x == 2){
            fout<<countAp()<<'\n';
        }else{
            fout<<calculatePref()<<'\n';
        }
    }
    return 0;
}