Cod sursa(job #1326611)

Utilizator catalincraciunCraciun Catalin catalincraciun Data 25 ianuarie 2015 18:43:49
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
/// trie
#include <iostream>
#include <cstring>
#include <fstream>
#define ch (*s - 'a')
using namespace std;

struct trie {
    int cnt, fii;
    trie *sons[26];
    trie() {
        cnt = fii = 0;
        for (int i=0;i<26;i++)
            sons[i] = NULL;
    }
    ~trie() {
        for (int i=0;i<26;i++)
            delete sons[i];
    }
};

ifstream f("trie.in");
ofstream g("trie.out");

trie *root;

bool trieRemove(trie *node, char *s) {
    if (*s == '\0')
        node->cnt--;
    else if (trieRemove(node->sons[ch], s+1)) {
        node->sons[ch] = NULL;
        node->fii--;
    }

    if (node != root && node->cnt == 0 && node->fii == 0) {
        delete node;
        return true;
    }
    return false;
}

void trieAdd(trie *node, char *s) {
    if (*s == '\0') {
        node->cnt++; return;
    }

    if (node->sons[ch] == NULL) {
        node->fii++;
        node->sons[ch] = new trie();
    }

    trieAdd(node->sons[ch], s+1);
}

int triePref(trie *node, char *s, int k) {
    if(*s == '\0' || node->sons[ch] == 0)
        return k;
    return triePref(node->sons[ch], s+1, k+1);
}

int trieFreq(trie *node, char *s) {
    if (*s == '\0')
        return node->cnt;
    else if (node->sons[ch] != NULL)
        return trieFreq(node->sons[ch], s+1);

    return 0;
}

int main() {

    root = new trie();
    char in[50];
    while (f.getline(in, 50)) {
        if (in[0] == '0') {
            trieAdd(root, in+2);
        } else if (in[0] == '1') {
            trieRemove(root, in+2);
        } else if (in[0] == '2') {
            g<<trieFreq(root, in+2)<<'\n';
        } else if (in[0] == '3') {
            g<<triePref(root, in+2, 0)<<'\n';
        }
    }

    f.close(); g.close();
    return 0;
}