Cod sursa(job #2300597)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 11 decembrie 2018 20:11:14
Problema Trie Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.98 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

vector<int>cnt; /// cnt end in poz
vector<int>plin; /// is plin
vector<vector<int>>kid;

inline void expand()
{
    cnt.push_back(0);
    plin.push_back(0);
    kid.push_back({});
    for(int i=0;i<26;i++)
    {
        kid.back().push_back(-1);
    }
}

inline void add(string s)
{
    int nod=0;
    for(auto &ch:s)
    {
        int x=ch-'a';
        if(kid[nod][x]==-1)
        {
            expand();
            kid[nod][x]=cnt.size()-1;
        }
        nod=kid[nod][x];
        plin[nod]++;
    }
    cnt[nod]++;
}

inline void del(string s)
{
    int nod=0;
    for(auto &ch:s)
    {
        int x=ch-'a';
        nod=kid[nod][x];
    }
    cnt[nod]--;
    if(cnt[nod]==0)
    {
        nod=0;
        for(auto &ch:s)
        {
            int x=ch-'a';
            nod=kid[nod][x];
            plin[nod]--;
        }
    }
}

inline int ask(string s)
{
    int nod=0;
    for(auto &ch:s)
    {
        int x=ch-'a';
        if(kid[nod][x]==-1)
        {
            return 0;
        }
        nod=kid[nod][x];
    }
    return cnt[nod];
}

inline int ppe(string s)
{
    int nod=0;
    int ans=0;
    for(auto &ch:s)
    {
        int x=ch-'a';
        if(kid[nod][x]==-1)
        {
            return ans;
        }
        nod=kid[nod][x];
        if(plin[nod]==0)
        {
            return ans;
        }
        ans++;
    }
    return ans;
}


int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    expand();
    int t;
    string s;
    while(cin>>t)
    {
        cin>>s;
        if(t==0)
        {
            add(s);
        }
        if(t==1)
        {
            del(s);
        }
        if(t==2)
        {
            cout<<ask(s)<<"\n";
        }
        if(t==3)
        {
            cout<<ppe(s)<<"\n";
        }
    }
    return 0;
}