Cod sursa(job #2712443)

Utilizator AndreiD31Dragan Andrei AndreiD31 Data 25 februarie 2021 19:22:15
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <bits/stdc++.h>

using namespace std;

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

struct trie
{
    int prefixes,word_count,next[51];
};

vector<trie>v;
trie zero;
int n,t;
char s[50];


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

int query1()
{
    int i,next_indice,poz_trie=0;
    for(i=0;i<n;i++)
    {
        next_indice=s[i]-'a';
        if(v[poz_trie].next[next_indice]==0)return 0;
        else poz_trie=v[poz_trie].next[next_indice];
    }
    return v[poz_trie].word_count;
}

int query2()
{
    int i,next_indice,poz_trie=0;
    for(i=0;i<n;i++)
    {
        next_indice=s[i]-'a';
        if(v[poz_trie].next[next_indice]==0 || v[v[poz_trie].next[next_indice]].prefixes<=0)return i;
        else poz_trie=v[poz_trie].next[next_indice];
    }
    return n;
}

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

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