Cod sursa(job #1225210)

Utilizator mihail.jianuJianu Mihail mihail.jianu Data 1 septembrie 2014 15:21:11
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include<cstdio>
#include<cstring>
const int L=20,S=30;
struct Node{
    Node*v[S+1];
    int no,noS;
    Node(){
        this->no=0;
        this->noS=0;
        memset(v,0,sizeof(v));
    }
};
Node*trie=new Node;
FILE*in,*out;
char word[L+1];
void add(Node*node,char*s ) {
    char c=*s-'a';
    if(*s=='\n'){
        node->no++;
        return;
    }
    if(node->v[c]==0){
        node->v[c]=new Node;
        node->noS++;
    }
    add(node->v[c],s+1);
}
int del(Node*node,char*s){
    char c=*s-'a';
    if(*s=='\n')
        node->no--;
    else if(del(node->v[c],s+1)){
        node->v[c]=0;
        node->noS--;
    }
    if(node->no==0&&node!=trie&&node->noS==0){
        delete node;
        return 1;
    }
    return 0;
}
int que(Node*node,char*s){
    char c=*s-'a';
    if(*s=='\n')
        return node->no;
    if(node->v[c])
        return que(node->v[c],s+1);
    return 0;
}
int pre(Node*node,char*s,int k){
    char c=*s-'a';
    if(*s=='\n'||node->v[c]==0)
        return k;
    return pre(node->v[c],s+1,k+1);
}
int main(){
    int type,x;
    in=fopen("trie.in","r");
    out=fopen("trie.out","w");
    while(true){
        x=fscanf(in,"%d ",&type);
        fgets(word,L+1,in);
        if(x<1)
            break;
        if(type==0)
            add(trie,word);
        else if(type==1)
            del(trie,word);
        else if(type==2)
            fprintf(out,"%d\n",que(trie,word));
        else
            fprintf(out,"%d\n",pre(trie,word,0));
    }
    return 0;
}