Cod sursa(job #1336332)

Utilizator smallOneAdina Mateescu smallOne Data 7 februarie 2015 16:55:43
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.36 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(char *w) {
    Trie *t = T;
    int i = 0;
    while(w[i] != '\n' && w[i] != '\0') {
        if(t->sons[CH] == 0) {
            t->sons[CH] = new Trie();
            t->num_sons++;
        }
        t = t->sons[CH];
        i++;
    }
    t->word_freq++;
}

int delWord(Trie *t, char *s) {
    if(s[0] == '\n' || s[0] == '\0') {
        t->word_freq--;
    }
    else if(delWord(t->sons[s[0] - 'a'], s + 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(char *w) {
    Trie *t = T;
    int i = 0;
    while(w[i] != '\n' && w[i] != '\0') {
        if(t->sons[CH] == 0) {
            return 0;
        }
        t = t->sons[CH];
        i++;
    }
    return t->word_freq; // t->sons[w[sz - 1] - 'a']->word_freq;
}

int prefWord(char *w) {
    Trie *t = T;
    int cnt = 0;
    int i = 0;
    while(w[i] != '\n' && w[i] != '\0') {
        if(t->sons[CH] == 0) {
            break;
        }
        t = t->sons[CH];
        cnt++;
        i++;
    }
    return cnt;
}

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

    T = new Trie();
    char s[30];

    while(fgets(s, sizeof(s), stdin) != NULL) {
        switch(s[0] - '0') {
            case 0:
                insWord(s + 2);
                break;
            case 1:
                delWord(T, s + 2);
                break;
            case 2:
                cout << queWord(s + 2) << "\n";
                break;
            case 3:
                cout << prefWord(s + 2) << "\n";
                break;
        }
    }

	return 0;
}