Cod sursa(job #2374251)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 7 martie 2019 17:41:07
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <bits/stdc++.h>

using namespace std;

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

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

void add_trie()
{
    int l=strlen(sir+1),nod=0;
    for(int i=1;i<=l;i++)
    {
        arb[nod].nr++;
        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].nrcuv++;
    arb[nod].nr++;
}

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

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

int lcp_trie()
{
    int l=strlen(sir+1),nod=0;
    for(int i=1;i<=l;i++)
    {
        if(arb[nod].v[sir[i]-'a']==0) return i-1;
        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);
        if(t==0) add_trie();
        else if(t==1) del_trie();
        else if(t==2) printf("%d\n",count_trie());
        else printf("%d\n",lcp_trie());
    }
    return 0;
}