Cod sursa(job #2737042)

Utilizator AndreiD31Dragan Andrei AndreiD31 Data 4 aprilie 2021 12:49:14
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <bits/stdc++.h>

using namespace std;

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

struct trie
{
    int count_words,count_prefixes,next_indice[31];
}zero;
vector<trie>v;

int n,t;
char s[101];

void update(int poz_trie, int poz_string, int val)
{
    v[poz_trie].count_prefixes+=val;
    if(poz_string==n)v[poz_trie].count_words+=val;
    else
    {
        int val_next_indice=s[poz_string]-'a'+1;
        if(v[poz_trie].next_indice[val_next_indice]==0)
        {
            t++;
            v.push_back(zero);
            v[poz_trie].next_indice[val_next_indice]=t;
        }
        update(v[poz_trie].next_indice[val_next_indice],poz_string+1,val);
    }
}

int query1()
{
    int poz_trie=0;
    for(int i=0;i<n;i++)
    {
        int val_next_indice=s[i]-'a'+1;
        if(v[poz_trie].next_indice[val_next_indice]==0)return 0;
        poz_trie=v[poz_trie].next_indice[val_next_indice];
    }
    return v[poz_trie].count_words;
}

int query2()
{
    int poz_trie=0;
    for(int i=0;i<n;i++)
    {
        int val_next_indice=s[i]-'a'+1;
        if(v[poz_trie].next_indice[val_next_indice]==0 || v[v[poz_trie].next_indice[val_next_indice]].count_prefixes<=0)return i;
        poz_trie=v[poz_trie].next_indice[val_next_indice];
    }
    return n;
}

int c;
int main()
{
    v.push_back(zero);t=0;

    while(f>>c>>s)
    {
        n=strlen(s);
        if(c==0)update(0,0,1);
        else if(c==1)update(0,0,-1);
        else if(c==2)g<<query1()<<'\n';
        else if(c==3)g<<query2()<<'\n';
    }
    return 0;
}