Cod sursa(job #1920106)

Utilizator george_stelianChichirim George george_stelian Data 9 martie 2017 22:28:59
Problema Trie Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

const int sigma=26;

struct trie
{
    int fiu[sigma],nr,s;
    trie()
    {
        nr=s=0;
        for(int i=0;i<sigma;i++) fiu[i]=0;
    }
};
vector<trie> t;
vector<int> liber;

int new_node()
{
    int poz;
    if(liber.size())
    {
        poz=liber.back();
        liber.pop_back();
    }
    else
    {
        t.push_back(trie());
        poz=t.size()-1;
    }
    return poz;
}

void trie_insert(string sir)
{
    int nod=0;
    for(int i=0;i<sir.size();i++)
    {
        t[nod].s++;
        if(!t[nod].fiu[sir[i]-'a'])
        {
            int poz=new_node();
            t[nod].fiu[sir[i]-'a']=poz;
        }
        nod=t[nod].fiu[sir[i]-'a'];
    }
    t[nod].s++;
    t[nod].nr++;
}

void trie_erase(string sir)
{
    int nod=0;
    for(int i=0;i<sir.size();i++)
    {
        int nod1=t[nod].fiu[sir[i]-'a'];
        if(t[t[nod].fiu[sir[i]-'a']].s==1) t[nod].fiu[sir[i]-'a']=0;
        if(--t[nod].s) liber.push_back(nod);
        nod=nod1;
    }
    t[nod].nr--;
    if(--t[nod].s) liber.push_back(nod);
}

int trie_count(string sir)
{
    int nod=0;
    for(int i=0;i<sir.size();i++)
        if(!t[nod].fiu[sir[i]-'a']) return 0;
        else nod=t[nod].fiu[sir[i]-'a'];
    return t[nod].nr;
}

int trie_prefix(string sir)
{
    int nod=0;
    for(int i=0;i<sir.size();i++)
        if(!t[nod].fiu[sir[i]-'a']) return i;
        else nod=t[nod].fiu[sir[i]-'a'];
    return sir.size();
}

int main()
{
    ifstream cin("trie.in");
    ofstream cout("trie.out");
    int tip;
    string sir;
    t.push_back(trie());
    while(cin>>tip>>sir)
    {
        if(tip==0) trie_insert(sir);
        else if(tip==1) trie_erase(sir);
        else if(tip==2) cout<<trie_count(sir)<<"\n";
        else cout<<trie_prefix(sir)<<"\n";
    }
    return 0;
}