Cod sursa(job #884162)

Utilizator alexandrul_21Niculescu Mihai alexandrul_21 Data 20 februarie 2013 18:37:39
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.49 kb
#include <stdio.h>
#include <math.h>
#include <string.h>
using namespace std;
struct nod{
    int nr;
    char s[30];
    nod *next;
}*First;
void Insert(nod *p,char s[30]){
    if(!p->next||strcmp(s,p->next->s)<0){
        nod *q=new nod;
        q->nr=1;
        strcpy(q->s,s);
        q->next=p->next;
        p->next=q;
    }
    else{
        if(strcmp(s,p->next->s)==0){
            p->nr++;
        }
        else
            Insert(p->next,s);
    }
}
int Read(char s[30]){
    int nr;
    scanf("%d %s\n",&nr,s);
    return nr;
}
void FirstFunction(){
    freopen("trie.in","r",stdin);
    First=new nod;
    First->nr=0;
    First->s[0]='\0';
    First->next=0;
}
void write(nod *p){
    if(p){
        printf("%d %s\n",p->nr,p->s);
        write(p->next);
    }
}
int Min(int a,int b){
    if(a<b)
        return a;
    return b;
}
int MaxPrefix(char prefix[30],char source[30]){
    int i,min=Min(strlen(prefix),strlen(source));
    for(i=0;i<min;i++){
        if(prefix[i]!=source[i])
            return i;
    }
    return i;
}
int Delete(nod *p,char s[120]){
    if(p->next==0||strcmp(s,p->next->s)<0)
        return 0;
    if(strcmp(p->next->s,s)==0){
        nod *q=p->next;
        if(q->nr>1)
            q->nr--;
        else{
            p->next=q->next;
            delete q;
        }
        return 1;
    }
    return Delete(p->next,s);
}
int NumberOfAppearances(nod *p,char s[120]){
    if(p->next==0||strcmp(s,p->next->s)<0)
        return 0;
    if(strcmp(p->next->s,s)==0){
        return p->next->nr;
    }
    return NumberOfAppearances(p->next,s);
}
int Max(int a,int b){
    if(a>b)
        return a;
    return b;
}
int MaximalPrefix(nod *p,char s[30]){
    if(p->next==0)
        return 0;
    int nr1=MaxPrefix(p->next->s,s);
    int n=strlen(s);
    if(nr1==n)
        return nr1;
    int nr2=MaximalPrefix(p->next,s);
    if(nr2==n)
        return nr2;
    return Max(nr1,nr2);
}
int main()
{
    int nr;
    char s[30];
    FirstFunction();
    freopen("trie.out","w",stdout);
    while(!feof(stdin)){
        nr=Read(s);
        if(nr==0)
            Insert(First,s);
        else if(nr==1){
            Delete(First,s);
        }
        else if(nr==2){
            printf("%d\n",NumberOfAppearances(First,s));
        }
        else if(nr==3){
            printf("%d\n",MaximalPrefix(First,s));
        }

    }
//write(First->next);
    fclose(stdin);
    fclose(stdout);
    return 0;
}