Cod sursa(job #2410498)

Utilizator danin01Nastase Daniel danin01 Data 20 aprilie 2019 09:24:04
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.04 kb
#include <fstream>
#include <vector>

using namespace std;

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

struct TNod{

    unsigned int index,nrAparitii,nrCuv;
    char val;

    TNod(unsigned int index,int nrCuv,int nrAparitii,char val):
        index(index),nrCuv(nrCuv),nrAparitii(nrAparitii),val(val)
        {

        }

};

vector< vector<TNod> > trie;

unsigned int k;
string str;
int op,n,nr,nod,j;
bool ok;

int main()
{
    trie.push_back(vector <TNod>());

    while(f>>op>>str)
    {

        n = str.size();
        nr = nod = j = 0;

        if(op==0)
        {

            while(j<n)
            {

                ok = false;
                int i;

                for(i=0;i<trie[nod].size();++i)
                {
                    if(trie[nod][i].val==str[j])
                    {
                        ok = true;
                        break;
                    }
                }

                if(ok)
                {
                    trie[nod][i].nrAparitii++;
                    if(j==n-1)
                        trie[nod][i].nrCuv++;

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

                    trie.push_back(vector<TNod>());

                    trie[nod].push_back(TNod(++k,(j==n-1) ? 1 : 0 ,1,str[j]));

                    nod = k;
                    ++j;

                }

            }

        }
        else
        {

            while(j<n)
            {
                ok = false;
                int i;

                for(i=0;i<trie[nod].size();++i)
                {
                    if(trie[nod][i].val==str[j])
                    {
                        ok = true;
                        break;
                    }
                }

                if(ok)
                {
                    if(trie[nod][i].nrAparitii>0)
                        ++nr;

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

                    if(j==n-1)
                    {

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

                    }

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

                }
                else
                {

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

                    break;

                }

            }

        }

    }

    return 0;
}