Cod sursa(job #1772793)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 7 octombrie 2016 00:20:13
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

struct trie
{
    int nrcuv,nrfii;
    vector<int> v;
    trie()
    {
        nrcuv=nrfii=0;
        v.resize(26);
    }
};

vector<trie> arb;
char cuv[22];
int d=0;

void add(char cuv[21])
{
    int nod=0;
    int l=strlen(cuv);
    for(int i=0;i<l;i++)
    {
        arb[nod].nrfii++;
        if(arb[nod].v[cuv[i]-'a']==0)
        {
            arb.push_back(trie());
            arb[nod].v[cuv[i]-'a']=arb.size()-1;
        }
        nod=arb[nod].v[cuv[i]-'a'];
    }
    arb[nod].nrcuv++;
    arb[nod].nrfii++;
}

void sterge(char cuv[21])
{
    int nod=0;
    int l=strlen(cuv);
    for(int i=0;i<l;i++)
    {
        arb[nod].nrfii--;
        nod=arb[nod].v[cuv[i]-'a'];
    }
    arb[nod].nrcuv--;
    arb[nod].nrfii--;
}

int gaseste(char cuv[21])
{
    int nod=0;
    int l=strlen(cuv);
    for(int i=0;i<l;i++)
    {
        if(arb[nod].v[cuv[i]-'a']==0) return 0;
        nod=arb[nod].v[cuv[i]-'a'];
    }
    return arb[nod].nrcuv;
}

int prefix(char cuv[21])
{
    int nod=0;
    int l=strlen(cuv);
    int r=0;
    for(int i=0;i<l;i++)
    {
        if(arb[nod].v[cuv[i]-'a']==0) break;
        nod=arb[nod].v[cuv[i]-'a'];
        if(arb[nod].nrfii>0) r=i+1;
    }
    return r;
}

int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    int tip;
    arb.push_back(trie());
    while(!feof(stdin))
    {
        scanf("%d %s\n",&tip,cuv);
        if(tip==0)  add(cuv);
        else if(tip==1) sterge(cuv);
        else if(tip==2) printf("%d\n",gaseste(cuv));
        else if(tip==3) printf("%d\n",prefix(cuv));
    }
    return 0;
}