Cod sursa(job #1775210)

Utilizator elffikkVasile Ermicioi elffikk Data 10 octombrie 2016 01:48:34
Problema Trie Scor 15
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <iostream>
#include <fstream>
#include <map>
#include <string>
using namespace std;

map<string, int> h, prefix;

void word_add(string w) {
    if (h.find(w) == h.end()) {
        h[w] = 1;
    } else {
        h[w] = h[w]+1;
    }
    string s;
    for (int i = 0; i < w.size(); i++) {
        s+=w[i];
        if (prefix.find(s) == prefix.end()) {
            prefix[s] = 1;
        } else {
            prefix[s] = prefix[s] + 1;
        }
    }
}

void word_remove(string w) {
    if (h.find(w) != h.end()) {
        if (h[w] > 0) {
            h[w]--;
        }
    }
    string s;
    for (int i = 0; i < w.size(); i++) {
        s+=w[i];
        if (prefix.find(s) != prefix.end()) {
            if (prefix[s] > 0)  {
                prefix[s]--;
            }
        }
    }
}

int word_count(string w) {
    if (h.find(w) != h.end()) {
        return h[w];
    }
    return 0;
}

int prefix_length(string w) {
    string s = w;
    while (s.size() > 0) {
        if (prefix.find(s) != prefix.end() && prefix[s] > 0) {
            return s.size();
        }
        s.erase(s.end()-1);
    }
    return 0;
}

int main() {
    ifstream cin("trie.in");
    ofstream cout("trie.out");
    int op;
    string w;
    while (!cin.eof()) {
        cin>>op>>w;
        if (op == 0) {
            word_add(w);
        }
        if (op == 1) {
            word_remove(w);
        }
        if (op == 2) {
            cout<<word_count(w)<<"\n";
        }
        if (op == 3) {
            cout<<prefix_length(w)<<"\n";
        }
    }
    return 0;
}