Cod sursa(job #1842211)

Utilizator tavonSuleyman Magnificul tavon Data 6 ianuarie 2017 17:27:38
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include<iostream>
#include<fstream>
using namespace std;

struct Trie{
    int Many,Pass;
    Trie * Sons[26];
    Trie(){
        Pass=Many=0;
        for(int i=0;i<26;i++) Sons[i]=NULL;
    }
} *root;

Trie* ins(Trie *n, char *s){
    if(n==NULL) n=new Trie();

    if(*(s) != '\0'){
        n->Sons[*s-'a'] = ins(n->Sons[*s-'a'],s+1);
    }
    else{
        n->Many++;
    }

    n->Pass++;
    return n;
}

Trie* rem(Trie *n, char *s){

    if(*(s) != '\0'){
        n->Sons[*s-'a'] = rem(n->Sons[*s-'a'],s+1);
    }
    else{
        n->Many--;
    }

    n->Pass--;
    if(n->Pass==0){
        delete n;
        return NULL;
    }
    return n;
}

int ap(Trie *n, char *s){
    if(n==NULL) return 0;
    if(*(s) != '\0'){
        return ap(n->Sons[*s-'a'],s+1);
    }
    return n->Many;
}

int lun(Trie *n, char *s){
    if(n==NULL){
        return -1;
    }

    if(*(s) != '\0'){
        return 1 + lun(n->Sons[*s-'a'],s+1);
    }
    return 0;
}

int n,t;
char s[30];

int main(){
    ifstream in("trie.in");
    ofstream out("trie.out");
    while(!in.eof()){
        in>>t;
        if(in.eof()) return 0;
        in.get();
        if(in.eof()) return 0;
        in.getline(s,30);
        if(in.eof()) return 0;

        if(t==0) root = ins(root,s);
        if(t==1) root = rem(root,s);
        if(t==2) out<< ap(root,s) <<'\n';
        if(t==3) out<< max(0,lun(root,s)) <<'\n';
    }
    return 0;
}