Cod sursa(job #3256944)

Utilizator PetreIonutPetre Ionut PetreIonut Data 16 noiembrie 2024 11:53:07
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <bits/stdc++.h>

using namespace std;

int n , x , Max;
char c[25];

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

struct Node{
    int cnt;
    Node *son[26];
    Node(){
        cnt=0;
        for(int i=0;i<26;i++) son[i]=nullptr;
    }
};

Node *t=new Node();

void update1(Node *nod , char *p , int l)
{
    if(l==0){
        ++nod->cnt;
        return;
    }
    int c=*p-'a';
    if(nod->son[c]==nullptr) nod->son[c]=new Node();
    update1(nod->son[c] , p+1 , l-1);
}

void update2(Node *nod , char *p , int l)
{
    int c=*p-'a';
    if(l==0){
        --nod->cnt;
        if(nod->cnt==0){
            nod->son[c]=nullptr;
        }
        return;
    }
    if(nod->son[c]==nullptr) return;
    update2(nod->son[c] , p+1 , l-1);
}

int query1(Node *nod , char *p , int l)
{
    if(l==0) return nod->cnt;
    int c=*p-'a';
    if(nod->son[c]==nullptr) return 0;
    query1(nod->son[c] , p+1 , l-1);
}

int query2(Node *nod , char *p , int l , int nr)
{
    int c=*p-'a';
    if(nod->son[c]==nullptr) return nr-l;
    query2(nod->son[c] , p+1 , l-1 , nr);
}

int main()
{
    while(f >> x){
        Max=0;
        f.get();
        f.getline(c , 20);
        int m=strlen(c);
        if(x==0){
            update1(t , c , m);
        }
        if(x==1){
            update2(t , c , m);
        }
        if(x==2){
            g << query1(t , c , m) << '\n';
        }
        if(x==3){
            g << query2(t , c , m , m) << '\n';
        }
    }
}