Cod sursa(job #928945)

Utilizator tudgal1001Profir Tudor tudgal1001 Data 26 martie 2013 19:31:48
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;

int lg;
char sir[25];

struct nod {
    int v[26],wd,pfx;
} blank;
vector<nod> T;

void add (int nod, int crt)
{
    T[nod].pfx++;
    if (crt==lg)
        T[nod].wd++;
    else
    {
        int next_nod=T[nod].v[sir[crt]-'a'];
        if (!next_nod)
        {
            nod=T.size(), T.push_back(blank);
        }
        T[nod].v[sir[crt]-'a']=next_nod;
        add(next_nod,crt+1);
    }
}

void erase (int nod, int crt)
{
    T[nod].pfx--;
    if (crt==lg)
        T[nod].wd--;
    else
        erase(T[nod].v[sir[crt]-'a'],crt+1);
}

void query_words (int nod, int crt)
{
    if (crt==lg)
        printf("%d\n",T[nod].wd);
    else
    {
        int next_nod=T[nod].v[sir[crt]-'a'];
        if (!next_nod)
            printf("0\n");
        query_words(next_nod,crt+1);
    }
}

void query_lcp (int nod, int crt)
{
    if (crt==lg)
        printf("%d\n",crt);
    else
    {
        int next_nod=T[nod].v[sir[crt]-'a'];
        if (!next_nod || !T[next_nod].pfx)
            printf("%d\n",crt);
        query_lcp(next_nod,crt+1);
    }
}

int main ()
{
    int tip=0;
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    T.push_back(blank);
    T.push_back(blank);
    T[0].pfx=T[1].pfx=1;
    while (tip!=-1)
    {
        tip=-1;
        scanf("%d %s",&tip,sir);
        lg=strlen(sir);
        if (tip==0)
            add(1,0);
        if (tip==1)
            erase(1,0);
        if (tip==2)
            query_words(1,0);
        if (tip==3)
            query_lcp(1,0);
    }
    return 0;
}