Cod sursa(job #1708781)

Utilizator UPB_Darius_Rares_SilviuPeace my pants UPB_Darius_Rares_Silviu Data 27 mai 2016 22:32:57
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.26 kb
#include <cstdio>
#include <cstring>
using namespace std;

#define CH(c) (c - 'a')

struct Trie {
    static const int ALPHA = 26;
    Trie *son[ALPHA];
    int cnt, end;

    Trie() {
        cnt = end = 0;
        memset(son, 0, sizeof(son));
    }

    ~Trie() {
        for (int i = 0; i < ALPHA; ++i) {
            if (son[ i ] != NULL) {
                delete son[ i ];
            }
        }
    }
};

void insert(Trie *node ,char *s) {
    ++node-> cnt;
    for (int i = 0; s[ i ]; ++i) {
        int x = CH( s[ i ] );

        if (node->son[ x ] == NULL) {
            node->son[ x ] = new Trie();
        }

        node = node->son[ x ];
        ++node->cnt;
      }

     ++node->end;
}

void remove(Trie *node ,char *s) {
    --node->cnt;

    for (int i = 0; s[ i ]; ++i) {
        int x = CH( s[ i ] );
        if (node->son[ x ] == NULL) {
            return;
        }
        node = node->son[ x ];
        --node->cnt;
    }

    --node->end;
    if (node->end < 0 ) {
        node -> end = 0;
    }
}

int search(Trie *node, char *s) {
    for (int i = 0; s[ i ]; ++i) {
        int x = s[ i ] - 'a' ;
        if (node->son[ x ] == NULL) {
            return 0;
        }
        node = node->son[ x ];
    }

    return node->end;
}

int lcp(Trie *node, char *s) {
    int i;
    for (i = 0; s[ i ]; ++i) {
        int x = s[ i ] - 'a' ;
        if (node->son[x] == NULL) {
            return i;
        }
        node = node->son[ x ];
        if (!node->cnt) {
            return i;
        }
    }
    return i;
}

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

    Trie *T =  new Trie();

    int op;
    char s[ 25 ];
    int result;

    while ( scanf("%d", &op) == 1) {
        scanf("%s", s);
        switch(op) {
            case 0:
                insert(T,s);
                break;
            case 1:
                remove(T,s);
                break;
            case 2:
                printf("%d\n", search(T,s) );
                break;
            case 3:
                printf("%d\n", lcp(T,s) );
                break;
            default:
                break;
        }
    }

    delete T;

    return 0;
}