Cod sursa(job #1360721)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 25 februarie 2015 17:26:06
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.12 kb
#include<cstdio>
#include<string>
#include<cstring>
#include<stack>

using namespace std;

#ifdef HOME
const string inputFile = "input.txt";
const string outputFile = "output.txt";
#else
const string problemName = "trie";
const string inputFile = problemName + ".in";
const string outputFile = problemName + ".out";
#endif

struct node {
    node *f[26];
    int pass, end;
    node() {
        pass = end = 0;
        memset(f, 0, sizeof(f));
    }
};

node *root;

void insert(char w[]) {
    int N = strlen(w), i, c;
    node *Q = root;

    for(i = 0; i < N; i++) {
        c = w[i] - 'a';

        if(!Q->f[c])
            Q->f[c] = new node;

        Q = Q->f[c];
        Q->pass++;
    }

    Q->end++;
}

void erase(char w[]) {
    int N = strlen(w), i, c;
    node *Q = root;
    node *P[30], *R;

    P[0] = root;

    for(i = 0; i < N; i++) {
        c = w[i] - 'a';
        Q = Q->f[c];
        Q->pass--;
        P[i + 1] = Q;
    }

    Q->end--;

    for(i = N; i >= 1; i--) {
        Q = P[i];
        R = P[i - 1];

        if(!Q->pass) {
            c = w[i - 1] - 'a';
            R->f[c] = 0;
            delete Q;
        } else
            break;
    }
}

int count(char w[]) {
    int N = strlen(w), i, c;
    node *Q = root;

    for(i = 0; i < N; i++) {
        c = w[i] - 'a';

        if(!Q->f[c])
            return 0;

        Q = Q->f[c];
    }

    return Q->end;
}

int prefix(char w[]) {
    int N = strlen(w), i, c;
    node *Q = root;

    for(i = 0; i < N; i++) {
        c = w[i] - 'a';

        if(!Q->f[c])
            return i;

        Q = Q->f[c];
    }

    return i;
}

int main() {
    int t;
    char w[30];

    freopen(inputFile.c_str(), "r", stdin);
    freopen(outputFile.c_str(), "w", stdout);

    root = new node;

    while(scanf("%d %s\n", &t, w) + 1) {
        if(t == 0) {
            insert(w);
            continue;
        }

        if(t == 1) {
            erase(w);
            continue;
        }

        if(t == 2) {
            printf("%d\n", count(w));
            continue;
        }

        if(t == 3) {
            printf("%d\n", prefix(w));
            continue;
        }
    }

    return 0;
}