Cod sursa(job #2358257)

Utilizator HoratioHoratiu Duma Horatio Data 27 februarie 2019 22:52:12
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.34 kb
#include <bits/stdc++.h>
#include <string>
#include <set>
using namespace std;

int n,l;

struct Nod
{
    Nod *copil[26];

    int nr;

    bool EOW=false;

};

struct Nod *NewNode(void)
{
    struct Nod *P = new Nod;

    for(int i=0; i<26; i++)
        P->copil[i]=NULL;
    P->nr=0;
    return P;
};

Nod *root=NewNode();


Nod *Poz[400005];

void insert(Nod *root,string s)
{
    Nod *Iter=root;

    for(auto it=s.begin();it<s.end()-1;it++)
    {
        int index=*it-'a';

        if(Iter->copil[index]==NULL)
        {
            Iter->copil[index]=NewNode();
        }
        Iter->copil[index]->nr++;

        Iter=Iter->copil[index];
    }
    Iter->EOW=true;
}

void Op0(string s)
{
    insert(root,s);
}

void itera(Nod *iter,string s,int i)
{
    if(i==s.length()-1)
        {
        iter->EOW=false;
        return;
        }
    int index=s[i]-'a';
    iter->copil[index]->nr--;
    itera(iter->copil[index],s,i+1);
    if(iter->copil[index]->nr==0)
    {
        iter->copil[index]=NULL;
    }
}

void Op1(string s)
{
    Nod *Iter=root;
    itera(root,s,0);
}

void Op2(string s)
{
    Nod *iter=root;
    int mx=1<<25;
    for(auto it=s.begin();it<s.end()-1;it++)
    {
        int index=*it-'a';
        if(iter->copil[index]==NULL)
        {
        printf("0\n");
        return;
        }
        else if(iter->copil[index]->nr<mx)
            mx=iter->copil[index]->nr;
        iter=iter->copil[index];
    }
    if(iter->EOW==true)
        printf("%d\n",mx);
    else
        printf("0\n");
}

void Op3(string s)
{
    Nod *iter=root;
    int l=0;
    for(auto it=s.begin();it<s.end()-1;it++)
    {
        int index=*it-'a';
        if(iter->copil[index]==NULL)
            break;
        l++;
        iter=iter->copil[index];
    }
    printf("%d\n",l);
}

int main()
{
    int k;
    freopen("triw.in","r",stdin);
    freopen("trie.out","w",stdout);

    while(scanf("%d ",&k)!=EOF)
    {
        string s="";
        char c='0';
        do
        {
            scanf("%c",&c);
            s+=c;
        }while(c!='\n');


        s[s.size()-1]='\0';

        if(k==0)
            Op0(s);
        if(k==1)
            Op1(s);
        if(k==2)
            Op2(s);
        if(k==3)
            Op3(s);
    }
    return 0;
}