Cod sursa(job #1208290)

Utilizator ZenusTudor Costin Razvan Zenus Data 15 iulie 2014 12:50:46
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.66 kb
#include <cstdio>
#include <vector>
#include <cstring>

using namespace std;

#define NMAX 150001

struct Trie
{
    int key;
    int terminal;
    int prefixes;
};
vector < Trie > L[NMAX];
int type,cnt_nodes;
char S[NMAX],ch[NMAX];
Trie NUL;

void Insert()
{
    int node=0,N=strlen(S),i,j;
    bool is;
    Trie actual;
    actual=NUL;

    for (j=0;j<N;++j)
    {
        is=false;

        for (i=0;i<L[node].size() && !is;++i)
        if (ch[L[node][i].key]==S[j])
        {
            if (j==N-1)
            ++L[node][i].terminal;

            ++L[node][i].prefixes;
            node=L[node][i].key;

            is=true;
        }

        if (is) continue;

        actual.key=++cnt_nodes;
        actual.prefixes=1;

        if (j==N-1)
        actual.terminal=1;

        L[node].push_back(actual);

        ch[cnt_nodes]=S[j];
        node=cnt_nodes;
    }
}

void Delete()
{
    int i,j,N=strlen(S),node=0;
    bool is;

    for (j=0;j<N;++j)
    {
        is=false;

        for (i=0;i<L[node].size() && !is;++i)
        if (ch[L[node][i].key]==S[j])
        {
            if (j==N-1)
            --L[node][i].terminal;

            --L[node][i].prefixes;
            node=L[node][i].key;

            is=true;
        }
    }
}

void Prefix()
{
    int i,j,length=0,node=0,N=strlen(S);
    bool is;

    for (j=0;j<N;++j)
    {
        is=false;

        for (i=0;i<L[node].size() && !is;++i)
        if (ch[L[node][i].key]==S[j] && L[node][i].prefixes!=0)
        {
            ++length;
            node=L[node][i].key;

            is=true;
        }

        if (!is)
        {
            printf("%d\n",length);
            return ;
        }
    }

    printf("%d\n",length);
}

void Query()
{
    bool is;
    int i,j,N=strlen(S),node=0;

    for (j=0;j<N;++j)
    {
        is=false;

        for (i=0;i<L[node].size() && !is;++i)
        if (ch[L[node][i].key]==S[j])
        {
            if (j==N-1)
            {
                printf("%d\n",L[node][i].terminal);
                return ;
            }

            node=L[node][i].key;

            is=true;
        }

        if (!is)
        {
            printf("0\n");
            return ;
        }
    }
}

int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);

scanf("%d%s",&type,&S);

while (!feof(stdin))
{
    switch(type)
    {
        case 0 : Insert();
        break;

        case 1 : Delete();
        break;

        case 2 : Query();
        break;

        case 3 : Prefix();
        break;
    }
    scanf("%d%s",&type,&S);
}

return 0;
}