Cod sursa(job #2416525)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 27 aprilie 2019 17:51:59
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <bits/stdc++.h>

using namespace std;

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

vector<trie> arb;
int l;
char sir[22];

void update()
{
    int nod=0;
    for(int i=1;i<=l;i++)
    {
        if(arb[nod].v[sir[i]-'a']==0)
        {
            arb.push_back(trie());
            arb[nod].v[sir[i]-'a']=arb.size()-1;
        }
        nod=arb[nod].v[sir[i]-'a'];
        arb[nod].nr++;
    }
    arb[nod].nrcuv++;
}

void trie_del()
{
    int nod=0;
    for(int i=1;i<=l;i++)
    {
        nod=arb[nod].v[sir[i]-'a'];
        arb[nod].nr--;
    }
    arb[nod].nrcuv--;
}

int nr_cuv()
{
    int nod=0;
    for(int i=1;i<=l;i++)
    {
        nod=arb[nod].v[sir[i]-'a'];
        if(arb[nod].nr==0) return 0;
    }
    return arb[nod].nrcuv;
}

int lcp()
{
    int nod=0;
    for(int i=1;i<=l;i++)
    {
        nod=arb[nod].v[sir[i]-'a'];
        if(arb[nod].nr==0) return i-1;
    }
    return l;
}

int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    int t;
    arb.push_back(trie());
    while(!feof(stdin))
    {
        scanf("%d %s\n",&t,sir+1);
        l=strlen(sir+1);
        if(!t) update();
        else if(t==1) trie_del();
        else if(t==2) printf("%d\n",nr_cuv());
        else printf("%d\n",lcp());
    }
    return 0;
}