Cod sursa(job #3227139)

Utilizator Simon2712Simon Slanina Simon2712 Data 25 aprilie 2024 23:22:28
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie{
    int next[26],cnt,totcnt;
} start;
vector<trie>v;
const int N=21;
char s[N];
int n=0;
void upd(int poz,int pozsir,int val)
{
    v[poz].totcnt+=val;
    if(s[pozsir]<'a' || s[pozsir]>'z')//am coborat  pana la nodul final
    {
        v[poz].cnt+=val;
        return;
    }
    int lit=s[pozsir]-'a';
    if(!v[poz].next[lit])
    {
        v.push_back(start);
        n++;
        v[poz].next[lit]=n;
    }
    upd(v[poz].next[lit],pozsir+1,val);
}
int query(int poz,int pozsir)
{
    if(s[pozsir]<'a' || s[pozsir]>'z')
        return v[poz].cnt;
    int lit=s[pozsir]-'a';
    if(!v[poz].next[lit])
        return 0;
    query(v[poz].next[lit],pozsir+1);
}
int prefix(int poz,int pozsir)
{
    if(!v[poz].totcnt)
        return pozsir-1;
    if(s[pozsir]<'a' || s[pozsir]>'z')
        return pozsir-1;
    int lit=s[pozsir]-'a';
    if(!v[poz].next[lit])
        return pozsir;
    prefix(v[poz].next[lit],pozsir+1);

}
int main()
{
    int q;
    v.push_back(start);
    while(fin>>q>>s)
    {
        if(q==0)
            upd(0,0,1);
        else
        if(q==1)
            upd(0,0,-1);
        else
        if(q==2)
            fout<<query(0,0)<<'\n';
        else
            fout<<prefix(0,0)<<'\n';
    }
    return 0;
}