Cod sursa(job #3037906)

Utilizator AndreiBOTOBotocan Andrei AndreiBOTO Data 26 martie 2023 17:18:16
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cstring>

///#include <tryhardmode>
///#include <GODMODE::ON>

using namespace std;

ifstream fin ("trie.in");
ofstream fout ("trie.out");

const int NMAX=1e6+5;

int t[NMAX][26];
int cuv[NMAX];
int frecv[NMAX];
int kon=2;

void add_string(string s)
{
    int i,p=1,n;
    n=s.length();
    for(i=0;i<n;i++)
    {
        if(t[p][s[i]-'a']==0)
        {
            t[p][s[i]-'a']=kon;
            kon++;
        }
        p=t[p][s[i]-'a'];
        frecv[p]++;
    }
    cuv[p]++;
}

void remove_string(string s)
{
    int i,p=1,n;
    n=s.length();
    for(i=0;i<n;i++)
    {
        p=t[p][s[i]-'a'];
        frecv[p]--;
    }
    cuv[p]--;
}

int freq(string s)
{
    int i,p=1,n;
    n=s.length();
    for(i=0;i<n;i++)
    {
        if(frecv[t[p][s[i]-'a']]==0)
            return 0;
        p=t[p][s[i]-'a'];
    }
    return cuv[p];
}

int lcp(string s)
{
    int i,p=1,n;
    int poz=0;
    n=s.length();
    for(i=0;i<n;i++)
    {
        if(frecv[t[p][s[i]-'a']]==0)
            return poz;
        else
        {
            poz++;
            p=t[p][s[i]-'a'];
        }
    }
    return poz;
}

int main()
{
    int t,i,j;
    while(fin>>t)
    {
        string s;
        fin>>s;
        if(t==0)
            add_string(s);
        else if(t==1)
            remove_string(s);
        else if(t==2)
            fout<<freq(s)<<"\n";
        else
            fout<<lcp(s)<<"\n";
    }
    return 0;
}