Cod sursa(job #2030618)

Utilizator al_k_ponyClaudiu Babin al_k_pony Data 1 octombrie 2017 20:56:12
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
# pragma GCC optimize("O3")
# include <bits/stdc++.h>
# define maxn 100005
# define ll long long
# define clock (clock() * 1000.0 / CLOCKS_PER_SEC)
# define rc(s) return cout << s,0
# define _ ios_base::sync_with_stdio(false);cin.tie(0);cerr.tie(0);cout.tie(0);
# define db(x) cerr << #x << " = " << x << '\n'
# define pb push_back
# define mp make_pair
# define sz(x) (int)((x).size())
//# define int ll
using namespace std;

struct data
{
    int x,nxt[27];
}tpl;

vector<data>vec;
short op;
int idx;
string s;
static int curr,ans;

inline void add()
{
    curr = 0;
    for(auto it : s)
    {
        if(!vec[curr].nxt[it - 'a']) {
            vec[curr].nxt[it - 'a'] = ++idx;
            vec.pb(tpl);
        }
        curr = vec[curr].nxt[it - 'a'];
        vec[curr].x++;
    }
    if(!vec[curr].nxt[26]) {
            vec[curr].nxt[26] = ++idx;
            vec.pb(tpl);
        }
    curr = vec[curr].nxt[26];
    vec[curr].x++;
}

inline void del()
{
    curr = 0;
    for(auto it : s)
    {
        curr = vec[curr].nxt[it - 'a'];
        vec[curr].x--;
    }
    curr = vec[curr].nxt[26];
    vec[curr].x--;
}

inline int cnt()
{
    curr = 0;
    for(auto it : s)
    {
        curr = vec[curr].nxt[it - 'a'];
        if(!curr) return 0;
    }
    curr = vec[curr].nxt[26];
    if(!curr) return 0;
    return vec[curr].x;
}

inline int mxprf()
{
    curr = 0;ans = 0;
    for(auto it : s)
    {
        curr = vec[curr].nxt[it - 'a'];
        if(!curr || vec[curr].x == 0) return ans;
        ans++;
    }
    return ans;
}

int32_t main(){_
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    tpl = {};
    vec.pb(tpl);
    while(cin >> op >> s)
    {
        if(op == 0) add();
        if(op == 1) del();
        if(op == 2) cout << cnt() << '\n';
        if(op == 3) cout << mxprf() << '\n';
    }
}