Cod sursa(job #1958840)

Utilizator LaurIleIle Laurentiu Daniel LaurIle Data 8 aprilie 2017 20:12:43
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

ofstream g("trie.out");

struct nod
{
    int aparitii, final_cuv;
    nod *fii[26];
};

void ins(nod *n, string s)
{
    ++n->aparitii;
    for(int i=0; i<s.size(); ++i)
    {
        if(!n->fii[s[i]-'a'])
            n->fii[s[i]-'a'] = new nod();
        n = n->fii[s[i]-'a'];
        ++n->aparitii;
    }
    ++n->final_cuv;
}

void del(nod *n, string s)
{
    --n->aparitii;
    for(int i=0; i<s.size(); ++i)
    {
        n = n->fii[s[i]-'a'];
        --n->aparitii;
    }
    --n->final_cuv;
}

int out(nod *n, string s)
{
    for(int i=0; i<s.size(); ++i)
    if(!n->fii[s[i]-'a']) return 0;
    else
    n = n->fii[s[i]-'a'];
    return n->final_cuv;
}

int pre(nod *n, string s)
{
    int lung_pref=0;
    for(  ;lung_pref < s.size() &&  n->fii[s[lung_pref]-'a'] && n->fii[s[lung_pref]-'a']->aparitii ; )
        n = n->fii[s[lung_pref++]-'a'];
    return lung_pref;
}

void read()
{
    ifstream f("trie.in");
    int cod; string s;
    nod *rad = new nod();
    while(f >> cod)
    {
        f >> s;
        if(cod == 0) ins(rad, s);
        if(cod == 1) del(rad, s);
        if(cod == 2) g << out(rad, s) << '\n';
        if(cod == 3) g << pre(rad, s) << '\n';
    }
    f.close();
}

int main()
{
    read();
    return 0;
}