Cod sursa(job #2158532)

Utilizator KemyKoTeo Virghi KemyKo Data 10 martie 2018 13:44:09
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.59 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;

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

struct nod
{
    int nr, index, cuv;
    char val;
} aux;

vector < nod > EMPTY;
vector < vector< nod > > trie;

int K;

void parcurgere(int i, int j, int n, string s, int op)
{
    int sz, nod = 0, nr = 0;
    bool ok;

    while(j<n)
    {
        ok = false;

        sz = trie[nod].size();
        for(i=0; i<sz; ++i)     //caut urm litera
        {
            if(trie[nod][i].val == s[j])
            {
                if(trie[nod][i].nr > 0)
                    ++nr;

                if(op==1)
                    --trie[nod][i].nr;

                if(j==n-1)
                {
                    if(op==2)g<<trie[nod][i].cuv<<'\n';
                    else if(op==3)g<<nr<<'\n';
                    else if(op==1)--trie[nod][i].cuv<<'\n';
                    return;
                }

                nod = trie[nod][i].index;
                ++j;
                ok = true;
                break;
            }
        }

        if(!ok){
            if(op==2 && j<n){
                g<<"0\n";
                return;
            }else if(op==3){
                g<<nr<<'\n';
                return;
            }
        }
    }
}

void adauga(int i, int j, int n, string s)
{
    int sz, nod = 0;
    while(j<n)      //j->string, i->trie
    {
        bool ok = false;

        sz = trie[nod].size();
        for(i=0; i<sz; ++i)     //caut urm litera
            if(trie[nod][i].val == s[j])
            {
                ok = true;

                ++trie[nod][i].nr;
                if(j==n-1)
                    ++trie[nod][i].cuv;

                nod = trie[nod][i].index;
                ++j;
                break;
            }

        if(!ok)                 //daca nu am gasit-o o adaug
        {
            aux.nr = 1;
            aux.index = ++K;
            aux.val = s[j];
            aux.cuv = 0;

            if(j==n-1)
                aux.cuv = 1;

            trie.push_back(EMPTY);
            trie[nod].push_back(aux);

            nod = aux.index;
            ++j;
        }
    }
}

int main()
{
    int op, n, i, j;
    string s;

    trie.push_back(EMPTY);

    while(f>>op>>s)
    {
        n = s.size();
        i = j = 0;

        if(op==0) adauga(i, j, n, s);
        else parcurgere(i, j, n, s, op);
    }

    /*for(i=0; i<trie.size(); ++i)            //afis - verif
    {
        for(j=0; j<trie[i].size(); ++j)
            cout<<"{ "<<trie[i][j].index<<' '<<trie[i][j].val<<' '<<trie[i][j].cuv<<" }"<<' ';
        cout<<'\n';
    }*/

    return 0;
}