Cod sursa(job #924047)

Utilizator mvcl3Marian Iacob mvcl3 Data 24 martie 2013 08:58:30
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>
#include <set>
#include <string>
using namespace std;

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

const int NMAX = 100009;
char line[32];
set < pair <string, int> > S;
int N, nr[NMAX];
string w;
set < pair <string, int> > :: iterator I;

inline int cmp(string s1, string s2){
    int i, l = s1.length(), ll = s2.length();
    for(i = 0; i < l && i < ll && s1[i] == s2[i]; ++i);

    return i;
}

int main() {
    S.insert(make_pair("'''", 0));
    while(!f.eof()) {
        f.getline(line, 32);
        w = string(line + 2);
        switch(line[0]) {
            case '0' :{
                    I = S.lower_bound(make_pair(w, 0));
                    if(I->first == w) nr[I->second] ++;
                    else {
                        S.insert(make_pair(w, ++N));
                        nr[N] = 1;
                    }
                    break;
                }
            case '1' : {
                I = S.lower_bound(make_pair(w, 0));
                nr[I->second] --;
                if(nr[I->second] == 0) S.erase(I);
                break;
            }
            case '2' : {
                I = S.lower_bound(make_pair(w, 0));
                if(I -> first == w) g << nr[I->second] << '\n';
                else g << "0\n";
                break;
            }
            case '3' : {
                int v1 = 0, v2 = 0;
                I = S.lower_bound(make_pair(w, 0));
                v1 = cmp(I->first, w);
                if(I != S.begin()) {
                    --I;
                    v2 = cmp(I->first, w);
                }
                g << max(v1, v2) << '\n';
                break;
            }
        }
    }

    g.close();
    return 0;
}