Cod sursa(job #2414888)

Utilizator MariusblockMoga Marius-Ioan Mariusblock Data 25 aprilie 2019 11:28:52
Problema Trie Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

struct trie{
    int nr = 0;
    int nrf = 0;
    trie *f[26];
    trie(){
        for(int i = 0; i < 26; i++){
            f[i] = 0;
        }
    }
};

trie *rad = new trie;

int del(trie *p,char *s){
    if(*s == '\n'){
        p->nr--;
    }else if(del(p->f[*s - 'a'],s+1)){
        p->nrf--;
        p->f[*s-'a'] = 0;
    }
    if(p != rad && p->nr == 0 && p->nrf == 0){
        delete p; return 1;
    }
    return 0;
}

void ins(trie *p,char *s){
    if(*s == '\n'){
        p->nr++; return;
    }
    if(p->f[*s - 'a'] == 0){
        p->f[*s - 'a'] = new trie;
        p->nrf++;
    }
    ins(p->f[*s-'a'],s+1);
}

int nrap(trie *p,char *s){
    if(*s == '\n'){
        return p->nr;
    }
    if(p->f[*s-'a']){
        return nrap(p->f[*s-'a'],s+1);
    }
    return 0;
}

int prefm(trie *p,char *s){
    if(p->f[*s-'a'] == 0 || *s == '\n'){
        return 0;
    }
    return prefm(p->f[*s-'a'],s+1) + 1;
}

int main()
{
    int i,aux;
    char s[26];
    while(!fin.eof()){
        fin.getline(s,26);
        s[strlen(s)+1]='\0';
        s[strlen(s)] = '\n';
        if(s[0] == '0'){
            ins(rad,s+2);
        }else if(s[0] == '1'){
            del(rad,s+2);
        }else if(s[0] == '2'){
            fout<<nrap(rad,s+2)<<endl;;
        }else if(s[0] == '3'){
            fout<<prefm(rad,s+2)<<endl;
        }
    }
    return 0;
}