Cod sursa(job #722851)

Utilizator algotrollNume Fals algotroll Data 24 martie 2012 18:41:12
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<fstream>
#include<string>
#include<map>
using namespace std;
typedef map<string,int>::iterator imap;

int pre_l(const string &a, const string &b)
{
    int i;
    for (i=0;i<a.size()&&i<b.size()&&a[i]==b[i];i++);
    return i;
}

int com_pre(map<string,int> &M, string &s)
{
    imap it=M.upper_bound(s);
    imap itp=it; --itp;
    if (it==M.begin()) return pre_l(it->first,s);
    if (it==M.end()) return pre_l(itp->first,s);
    return max(pre_l(it->first,s),pre_l(itp->first,s));
}

int main()
{
    ifstream fin("trie.in");
    ofstream fout("trie.out");
    map<string,int> M;
    while (fin.good())
    {
        int op; string tmp;
        fin>>op>>tmp; if (tmp=="") break;
        switch (op)
        {
        case 0:
            if (M.find(tmp)==M.end()) M.insert(pair<string,int>(tmp,1));
            else M.find(tmp)->second++;
            break;
        case 1:
            if (M.find(tmp)->second==1) M.erase(M.find(tmp));
            else M.find(tmp)->second--;
            break;
        case 2:
            if (M.find(tmp)==M.end()) fout<<"0\n";
            else fout<<M.find(tmp)->second<<'\n';
            break;
        case 3:
            fout<<com_pre(M, tmp)<<'\n';
        }
    }
    return 0;
}