Cod sursa(job #2550692)

Utilizator AndreiD31Dragan Andrei AndreiD31 Data 19 februarie 2020 00:38:33
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <bits/stdc++.h>

using namespace std;

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

struct trie
{
    int prefixes,words,next[26];
} zero;
vector <trie> v;
int t,n_string;
char s[30];

void update(int poz_trie,int poz_string, int value)
{
    v[poz_trie].prefixes += value;
    if(poz_string==n_string)
    {
        v[poz_trie].words += value;
        return;
    }
    else
    {
        int next_char_ind = int(s[poz_string] - 'a');
        if(v[poz_trie].next[next_char_ind]==0)
        {
            /// il creeam si ii atribuim un indice
            v.push_back(zero);
            t++;
            v[poz_trie].next[next_char_ind]=t;
        }

        update(v[poz_trie].next[next_char_ind], poz_string+1, value);
    }
}

int query1()
{
    int poz_trie=0,i;
    for(i=0; i<n_string; i++)
    {
        int next_char_ind = int(s[i]-'a');
        if(v[poz_trie].next[next_char_ind]==0)
            break;

        poz_trie=v[poz_trie].next[next_char_ind];
    }

    if(i==n_string) return v[poz_trie].words;
    else return 0;
}

int query2()
{
    int poz_trie=0,i;
    for(i=0; i<n_string; i++)
    {
        int next_char_ind = int(s[i]-'a');
        if(v[poz_trie].next[next_char_ind]==0 || v[v[poz_trie].next[next_char_ind]].prefixes<=1)
            break;

        poz_trie = v[poz_trie].next[next_char_ind];
    }
    return (i+1);
}

int tip;
int main()
{
    v.push_back(zero);
    while(f>>tip>>s)
    {
        n_string=strlen(s);

        if(tip==0)update(0,0,1);
        else if(tip==1)update(0,0,-1);
        else if(tip==2)g<<query1()<<'\n';
        else if(tip==3)g<<query2()<<'\n';
    }
    return 0;
}