Cod sursa(job #2875363)

Utilizator RK13Barbu Eduard RK13 Data 21 martie 2022 14:53:20
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>
//#pragma GCC optimize ("O3")
//#pragma GCC optimize ("unroll-loops")
//#pragma GCC optimize ("Ofast")

using namespace std;

ifstream f("trie.in");
ofstream g("trie.out");

struct trie
{
int sum,nr,v[30];
};

vector <trie> a;

char s[21];
int k,p;

void add(int x,int i)
{
    a[x].sum++;
    if(s[i+1]=='\0')
        a[x].nr++;
    else
    {
        if(a[x].v[s[i+1]-'a']==0)
            k++,a[x].v[s[i+1]-'a']=k,a.push_back({0,0,0});
        add(a[x].v[s[i+1]-'a'],i+1);
    }
}

void del(int x,int i)
{
    a[x].sum--;
    if(s[i+1]=='\0')
        a[x].nr--;
    else
        del(a[x].v[s[i+1]-'a'],i+1);
}

int ap(int x,int i)
{
    if(s[i+1]=='\0')
        return a[x].nr;
    if(a[x].v[s[i+1]-'a']==0)
        return 0;
    return ap(a[x].v[s[i+1]-'a'],i+1);
}

int pref(int x,int i)
{
    if(a[x].sum==0)
        return max(i-1,0);
    if(s[i+1]=='\0')
        return i;
    if(a[x].v[s[i+1]-'a']==0)
        return i;
    return pref(a[x].v[s[i+1]-'a'],i+1);
}

int main()
{a.push_back({0,0,0});
while (f>>p)
{
f>>(s+1);
if (p==0) add(0,0);
if (p==1) del(0,0);
if (p==2) g<<ap(0,0)<<'\n';
if (p==3) g<<pref(0,0)<<'\n';
}
}