Cod sursa(job #858550)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 18 ianuarie 2013 23:19:23
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.36 kb
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#define pb push_back
#define mp make_pair
#define un unsigned
using namespace std;

string x;

vector<pair<char,int> > list[120005];
int trie[120005],sz=1,exist[120005];

void insert(string x)
{
    int nod=1;
    bool gasit;
    for(un int i=0;i<x.size();++i)
    {
        gasit=false;
        for(un int j=0;j<list[nod].size();++j)
            if(list[nod][j].first==x[i])
            {
                nod=list[nod][j].second;
                gasit=true;
                break;
            }
        if(gasit==false)
        {
            list[nod].pb(mp(x[i],++sz));
            nod=sz;
        }
        ++exist[nod];
    }
    ++trie[nod];
}

void erase(string x)
{
    int nod=1;
    for(un int i=0;i<x.size();++i)
    {
        for(un int j=0;j<list[nod].size();++j)
            if(list[nod][j].first==x[i])
            {
                nod=list[nod][j].second;
                break;
            }
        --exist[nod];
    }
    --trie[nod];
}
int search(string x)
{
    int nod=1;
    bool gasit;
    for(un int i=0;i<x.size();++i)
    {
        gasit=false;
        for(un int j=0;j<list[nod].size();++j)
            if(list[nod][j].first==x[i])
            {
                nod=list[nod][j].second;
                gasit=true;
                break;
            }
        if(gasit==false)
            return 0;
    }
    return trie[nod];
}

int find(string x)
{
    int nod=1,adancime=0,maxim=0;
    bool gasit;
    for(un int i=0;i<x.size();++i)
    {
        gasit=false;
        for(un int j=0;j<list[nod].size();++j)
            if(list[nod][j].first==x[i])
            {
                nod=list[nod][j].second;
                gasit=true;
                break;
            }
        if(gasit==false)
            return maxim;
        else
            ++adancime;
        if(exist[nod])
        {
            //cout<<" WHY ?";
            maxim=max(maxim,adancime);
        }
    }
    return maxim;
}

int main()
{
    ifstream f("trie.in");
    ofstream g("trie.out");
    while(getline(f,x))
    {
        int op=x[0]-'0';
        x.erase(x.begin(),x.begin()+2); //
       // cout<<x<<endl;
        ///
        if(op==0)
            insert(x);
        if(op==1)
            erase(x);
        if(op==2)
            g<<search(x)<<"\n";
        if(op==3)
            g<<find(x)<<"\n";
    }
    return 0;
}