Cod sursa(job #2405273)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 14 aprilie 2019 11:32:25
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.61 kb
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
 
struct Tnod
{
    char chr;
    int nrap,nrcuv,urm;
};
vector <vector <Tnod> > t;
char str[10001];
int op,i,j,n,ok,nod,nr,sz,k;
int main()
{
    t.push_back(vector <Tnod>());
    while(f>>op>>str)
    {
        n = strlen(str);
        nr = nod = j = 0;
        switch (op)
        {
        case 0:
        while(j<n)
        {
            ok=false;
            sz=t[nod].size();
            for(i=0; i<sz;i++)
            {
                if(t[nod][i].chr==str[j])
                {
                    ok=true;
                    break;
                }
            }
            if(ok)
            {
                ++t[nod][i].nrap;
                if(j==n-1)++t[nod][i].nrcuv;
                j++;
                nod=t[nod][i].urm;
            }
            else
            {
                t.push_back(vector<Tnod>());
                Tnod aux;
                aux.chr=str[j];
                aux.nrap=1;
                if(j==n-1)aux.nrcuv=1;
                else aux.nrcuv=0;
                aux.urm = ++k;
                t[nod].push_back(aux);
                nod = k;
                j++;
            }
        }
        break;
        case 1:
        case 2:
        case 3:
                while(j < n){
                    ok = false;
 
                    sz = t[nod].size();
                    for(i=0; i<sz; ++i)
                        if(t[nod][i].chr == str[j])
                            {ok = true; break;}
 
                    if(ok){
                        if(t[nod][i].nrap > 0)
                            ++nr;
 
                        if(op == 1)         //stergere
                            --t[nod][i].nrap;
 
                        if(j == n-1){
                            if(op == 2)     //afis nr cuvinte
                                g << t[nod][i].nrcuv << '\n';
                            else if(op==3)  //afis lungime max comuna
                                g << nr << '\n';
                            else if(op==1)  //sterge si aparitia cuvantului
                                --t[nod][i].nrcuv;
                        }
 
                        nod = t[nod][i].urm;
                        ++j;
                    }
                    else {
                        if(op == 2 && j < n)
                            g << "0\n";
                        else if(op == 3)
                            g << nr << '\n';
 
                        break;  //exit the while loop
                    }
 
                }
 
                break;
        }
 
    }
    return 0;
}}