Cod sursa(job #2480137)

Utilizator gavra_bogdanBogdan Gavra gavra_bogdan Data 24 octombrie 2019 22:48:12
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 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==0)
            update();
        if(t==1)
            trie_del();
        if(t==2)
            printf("%d\n",nr_cuv());
        if(t==3)
            printf("%d\n",lcp());
    }
    return 0;
}