Cod sursa(job #1715911)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 11 iunie 2016 16:58:19
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <bits/stdc++.h>
using namespace std;

char str[32];

struct TRIE {
    int aps,
        nbarn;
    TRIE *barn[26];

    TRIE() {
        aps   = 0;
        nbarn = 0;
        memset(barn, NULL, sizeof(barn));
    }

} *root;

void insert(void) {
    TRIE *tmp = root;

    for(int i=0; str[i]; ++i) {
        if(tmp->barn[str[i]-'a'])
            tmp = tmp->barn[str[i]-'a'];
        else {
            tmp->barn[str[i]-'a'] = new TRIE();
            tmp = tmp->barn[str[i]-'a'];
        }
        ++(tmp->nbarn);
    }
    ++(tmp->aps);
}
void remove(void) {
    TRIE *tmp = root;

    for(int i=0; str[i]; ++i) {
        tmp = tmp->barn[str[i]-'a'];
        --(tmp->nbarn);
    }
    --(tmp->aps);
}
int   count(void) {
    TRIE *tmp = root;
    for(int i=0; str[i]; ++i) {
        if(tmp->barn[str[i]-'a']==NULL)
            return 0;
        tmp = tmp->barn[str[i]-'a'];
    }
    return tmp->aps;
}
int     pfx(void) {
    TRIE *tmp = root;
    int   ans = 0;

    for(int i=0; str[i]; ++i) {
        if(tmp->barn[str[i]-'a']==NULL)
            return ans;
        tmp = tmp->barn[str[i]-'a'];
        if(tmp->nbarn)
            ans = i + 1;
        else
            return ans;
    }
    return ans;
}

int main(void) {
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);
    int tsk;

    root = new TRIE();

    while(scanf("%d %s",&tsk,str)!=EOF) {
    switch(tsk) {
    case 0:
        insert();
        break;
    case 1:
        remove();
        break;
    case 2:
        printf("%d\n",count());
        break;
    case 3:
        printf("%d\n",pfx());
        break;
    }}

    fclose(stdin);
    fclose(stdout);
    return 0;
}