Cod sursa(job #1336111)

Utilizator smallOneAdina Mateescu smallOne Data 6 februarie 2015 18:00:19
Problema Trie Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.28 kb
#include <cstdio>
#include <iostream>
#include <fstream>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <sstream>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <ctype.h>
#include <cstring>
#include <string>
#include <ctime>
#include <cassert>
#include <utility>

#define CH (w[i] - 'a')

using namespace std;

struct Trie {
    int word_freq, num_sons;
    Trie *sons[26];

    Trie() {
        word_freq = 0;
        num_sons = 0;
        memset(sons, 0, sizeof(sons));
    }
};

Trie *T;

void insWord(string w) {
    Trie *t = T;
    int sz = w.size();
    for(int i = 0; i < sz; i++) {
        if(t->sons[CH] == 0) {
            t->sons[CH] = new Trie();
            t->num_sons++;
        }
        t = t->sons[CH];
    }
    t->word_freq++;
}

int delWord(Trie *t, string s) {
    if(s == "") {
        t->word_freq--;
    }
    else if(delWord(t->sons[s[0] - 'a'], s.substr(1))) {
        t->sons[s[0] - 'a'] = 0;
        t->num_sons--;
    }
    if(t->num_sons == 0 && t->word_freq == 0 && t != T) {
        delete t;
        return 1;
    }
    return 0;
}

int queWord(string w) {
    Trie *t = T;
    int sz = w.size();
    for(int i = 0; i < sz; i++) {
        if(t->sons[CH] == 0) {
            return 0;
        }
        t = t->sons[CH];
    }
    return t->word_freq; // t->sons[w[sz - 1] - 'a']->word_freq;
}

int prefWord(string w) {
    Trie *t = T;
    int cnt = 0;
    int sz = w.size();
    for(int i = 0; i < sz; i++) {
        if(t->sons[CH] == 0) {
            break;
        }
        t = t->sons[CH];
        cnt++;
    }
    return cnt;
}

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

    int id;
    string w;
    T = new Trie();
    while(cin >> id >> w) {
        switch(id) {
            case 0:
                insWord(w);
                break;
            case 1:
                delWord(T, w);
                break;
            case 2:
                cout << queWord(w) << "\n";
                break;
            case 3:
                cout << prefWord(w) << "\n";
                break;
        }
    }

	return 0;
}