Cod sursa(job #1643732)

Utilizator george_stelianChichirim George george_stelian Data 9 martie 2016 20:00:37
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include <cstdio>
#include <vector>
#include <cstring>

using namespace std;

struct trie
{
    int fiu[26],nr,cnt;
}aux;
vector<trie> v;
vector<int> liber;
char sir[25];

int get_new_position()
{
    if(liber.size())
    {
        int a=liber.back();
        liber.pop_back();
        return a;
    }
    else
    {
        v.push_back(aux);
        return v.size()-1;
    }
}

void trie_add(char sir[])
{
    int n=strlen(sir),nod=0;
    for(int i=0;i<n;i++)
    {
        if(!v[nod].fiu[sir[i]-'a'])
        {
            int a=get_new_position();
            v[nod].fiu[sir[i]-'a']=a;
        }
        nod=v[nod].fiu[sir[i]-'a'];
        v[nod].nr++;
    }
    v[nod].cnt++;
}

void trie_erase(char sir[])
{
    int n=strlen(sir),nod=0;
    for(int i=0;i<n;i++)
    {
        int nod1=v[nod].fiu[sir[i]-'a'];
        if(--v[nod1].nr==0)
        {
            v[nod].fiu[sir[i]-'a']=0;
            liber.push_back(nod1);
        }
        nod=nod1;
    }
    v[nod].cnt--;
}

int trie_count_apparitions(char sir[])
{
    int n=strlen(sir),nod=0;
    for(int i=0;i<n;i++)
    {
        if(!v[nod].fiu[sir[i]-'a']) return 0;
        nod=v[nod].fiu[sir[i]-'a'];
    }
    return v[nod].cnt;
}

int trie_longest_prefix(char sir[])
{
    int n=strlen(sir),nod=0;
    for(int i=0;i<n;i++)
    {
        if(!v[nod].fiu[sir[i]-'a']) return i;
        nod=v[nod].fiu[sir[i]-'a'];
    }
    return n;
}

int main()
{
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);
    v.push_back(aux);
    while(!feof(stdin))
    {
        int tip;
        scanf("%d %s\n",&tip,sir);
        if(tip==0) trie_add(sir);
        else if(tip==1) trie_erase(sir);
        else if(tip==2) printf("%d\n",trie_count_apparitions(sir));
        else printf("%d\n",trie_longest_prefix(sir));
    }
    return 0;
}