Cod sursa(job #3040046)

Utilizator fabian_anghelFabian Anghel fabian_anghel Data 29 martie 2023 11:38:41
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <fstream>
#include <string>
using namespace std;
int k;
string s;
struct trie{
    struct trie* child[26];
    int fr,fin;
};

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

void tinsert(trie* p,string s)
{
    trie *q=p;
    int n=s.length();
    for(int i=0;i<n;i++)
    {
        int j=s[i]-'a';
        if(!q->child[j])
        {
            trie *o=new trie();
            q->child[j]=o;
        }
        q->fr++;
        q=q->child[j];
    }
    q->fin++;
    q->fr++;
}

trie* tdelete(trie* q, string s, int poz)
{
    if(!q)
        return q;
    if(poz==s.length())
    {
        q->fr--;
        q->fin--;
        if(q->fr==0)
        {
            delete q;
            q=NULL;
        }
        return q;
    }
    int j=s[poz]-'a';
    q->child[j]=tdelete(q->child[j],s,poz+1);
    q->fr--;
    if(q->fr==0)
    {
        delete q;
        q=NULL;
    }
    return q;
}

int tfind(trie* p, string s)
{
    trie *q=p;
    int n=s.length();
    for(int i=0;i<n;i++)
    {
        int j=s[i]-'a';
        if(!q->child[j])
            return 0;
        q=q->child[j];
    }
    return q->fin;
}

int tpre(trie* p, string s)
{
    trie *q=p;
    int n=s.length();
    for(int i=0;i<n;i++)
    {
        int j=s[i]-'a';
        if(!q->child[j])
            return i;
        q=q->child[j];
    }
    return n;
}

int main()
{
    trie* p = new trie();
    while(f>>k>>s)
    {
        if(k==0)
            tinsert(p,s);
        else if(k==1)
            p=tdelete(p,s,0);
        else if(k==2)
            g<<tfind(p,s)<<'\n';
        else
            g<<tpre(p,s)<<'\n';
    }
    f.close();
    g.close();
    return 0;
}