Cod sursa(job #1886036)

Utilizator antracodRadu Teodor antracod Data 20 februarie 2017 16:51:23
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <string>

using namespace std;

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

const int sigma = 26;
const int NMAX = 100000;

string cuv;
struct nod
{
    int v[sigma];
    int x,y;
} nul;

vector <nod> g;

void add()
{
    int x=1;
    for(int i=0; i<(int)cuv.size(); i++)
    {
        if(g[x].v[cuv[i]-'a']==0)
        {
            g.push_back(nul);
            g[x].v[cuv[i]-'a']=g.size()-1;
        }
        g[x].y++;
        x=g[x].v[cuv[i]-'a'];
    }
    g[x].y++;
    g[x].x++;
}
void del()
{
    int x=1;
    for(int i=0; i<(int)cuv.size(); i++)
    {
        g[x].y--;
        x=g[x].v[cuv[i]-'a'];
    }
    g[x].y--;
    g[x].x--;
}
void query1()
{
    int x=1;
    for(int i=0; i<(int)cuv.size(); i++)
    {
        if(g[x].v[cuv[i]-'a']==0)
        {
            out<<0<<'\n';
            return;
        }
        else
        {
            x=g[x].v[cuv[i]-'a'];
        }
    }
    out<<g[x].x<<'\n';
}
void query2()
{
    int x=1;
    for(int i=0; i<(int)cuv.size(); i++)
    {
        if (g[x].y==0)
        {
            out << i << "\n";
            return;
        }
        else if(g[x].v[cuv[i]-'a']==0)
        {
            out<<i-1<<'\n';
            return;
        }

        x=g[x].v[cuv[i]-'a'];
    }
    out<<g[x].y<<'\n';
}

int main()
{

    for(int i=0; i<sigma; i++)
    {
        nul.v[i]=0;
    }
    nul.x=0;
    nul.y=0;
    g.push_back(nul);
    g.push_back(nul);
    int op;
    while(in>>op)
    {
        in>>cuv;
        if(op==0)
        {
            add();
        }
        else if(op==1)
        {
            del();
        }
        else if(op==2)
        {
            query1();
        }
        else
        {
            query2();
        }
    }
    return 0;
}