Cod sursa(job #3279562)

Utilizator robert111Peter Robert robert111 Data 23 februarie 2025 14:43:31
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#include <fstream>

using namespace std;
ifstream cin("trie.in");
ofstream cout("trie.out");
struct nod///26 de ref
{
    nod* ch[26];
    int cnt;
    int ter;
    nod()
    {
        ter=0;
        cnt=0;
        for(int i=0; i<26; i++)
            ch[i]=nullptr;
    }
}*root;
void inse(string s)
{
    nod* a=root;
    for(int i=0; i<s.size(); i++)
    {
        int ind=s[i]-'a';
        //cout<<a->cnt;
        if(!a->ch[ind])
        {
            //cout<<"-";
            a->ch[s[i]-'a']=new nod;
            a->ch[s[i]-'a']->cnt++;
        }
        else
            a->ch[s[i]-'a']->cnt++;
        a=a->ch[s[i]-'a'];
    }
    a->ter++;
}
void del(string s)
{
    nod* a=root;
    for (int i=0; i<s.size(); i++)
    {
        if (!a->ch[s[i]-'a'] || a->ch[s[i]-'a']->cnt==0)
        {
            return;
        }
        a=a->ch[s[i]-'a'];
    }
    if(a->ter)
    {
        a->ter--;
        a=root;
        for (int i=0; i<s.size(); i++)
        {
            a->ch[s[i]-'a']->cnt--;
            a=a->ch[s[i]-'a'];
        }
    }
}
int cer2(string s)
{
    nod* a=root;
    for(int i=0; i<s.size(); i++)
    {
        if(!a->ch[s[i]-'a'] || a->ch[s[i]-'a']->cnt==0)//il cream
            return 0;
        a=a->ch[s[i]-'a'];
    }
    return a->ter;
}
int cer3(string s)
{
    int max1=0;
    nod* a=root;
        for(int i=0; i<s.size(); i++)
        {
            if(!a->ch[s[i]-'a'] || a->ch[s[i]-'a']->cnt==0)
                break;
                max1=i+1;
            a=a->ch[s[i]-'a'];
        }
    return max1;
}
int main()
{
    string s;
    int a;
    root=new nod;
    while(cin>>a>>s)
    {
        if(a==0)inse(s);
        else if(a==1)
            del(s);
        else if(a==2)cout<<cer2(s)<<'\n';
        else if(a==3)
            cout<<cer3(s)<<'\n';
    }
    return 0;
}