Cod sursa(job #3004190)

Utilizator CipriEuCruceanu Ciprian Constantin CipriEu Data 16 martie 2023 10:28:02
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
int c, cnt; char s[21];
bool ok = true;

struct trie{
    trie * nxt[26] = {NULL};
    int nr;
};
trie * root = new trie;

int conv(char a){return a-97;}

void cer0(trie* r, int i){
    if(i < strlen(s)){
        if(!r->nxt[conv(s[i])])
        r->nxt[conv(s[i])] = new trie;
        cer0(r->nxt[conv(s[i])], i+1);
    }
    else r->nr++;
}

void cer1(trie* r, int i){
    if(i < strlen(s)){
        if(r->nxt[conv(s[i])])
        cer1(r->nxt[conv(s[i])], i+1);
    }
    else r->nr--;
}

void cer2(trie* r, int i){
    if(i < strlen(s)){
        if(r->nxt[conv(s[i])])
        cer2(r->nxt[conv(s[i])], i+1);
    }
    else fout<<r->nr<<"\n";
}

bool src(trie * r){
    if(r->nr>0) return 1;
    bool found = false;
    for(int i=0; i<26; i++){
        if(r->nxt[i]) found = src(r->nxt[i]);
        if(found) return 1;
    }
    return 0;
}

void cer3(trie* r, int i){ if(ok){
        if(i < strlen(s)){
            if(r->nxt[conv(s[i])])
            cer3(r->nxt[conv(s[i])], i+1);
        }
        if(i<strlen(s) && r->nr){
            ok = false;
            cnt = i+1;
        }
        for(int j=0; j<26; j++){
            if(r->nxt[j] && j!=conv(s[i])){
                if(src(r->nxt[j])){
                    ok = false;
                    cnt = i+1;
                }
            }
        }
    }
}

int main(){
    while(fin>>c>>s){
        if(c==0) cer0(root, 0);
        if(c==1) cer1(root, 0);
        if(c==2) cer2(root, 0);
        if(c==3) {cnt=0; ok = true; cer3(root, 0); fout<<cnt<<"\n";}

    }
}