Cod sursa(job #1471365)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 13 august 2015 17:31:09
Problema Trie Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.1 kb
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N M
typedef struct M {
	int c,n;
	struct M *f[26];
};
void A(N *s,char *l) {
	if(*l=='\n') {
		s->c++;
        return;
	}
	if(!s->f[*l-'a'])
        s->f[*l-'a']=(N*)malloc(sizeof(N)),s->n++;
	A(s->f[*l-'a'],l+1);
}
N *t=(N*)malloc(26*sizeof(N));
int D(N *s,char *l) {
	if(*l=='\n')
        s->c--;
	else if(D(s->f[*l-'a'],l+1))
        s->f[*l-'a']=0,s->n--;
	if(!s->c&&!s->n&&s!=t) {
		free(s);
      	return 1;
	}
	return 0;
}
int C(N *s,char *l) {
	if(*l=='\n')
        return s->c;
	if(s->f[*l-'a'])
        return C(s->f[*l-'a'],l+1);
	return 0;
}
int E(N *s,char *l,int k) { return *l=='\n'||!s->f[*l-'a']?k:E(s->f[*l-'a'],l+1,k+1); }
int main() {
    char l[32];
	freopen("trie.in","r",stdin),freopen("trie.out","w",stdout),fgets(l,32,stdin);
	while(!feof(stdin)) {
		if(l[0]=='0')
        	A(t,l+2);
     	else if(l[0]=='1')
            D(t,l+2);
     	else if(l[0]=='2')
            printf("%d\n",C(t,l+2));
     	else if(l[0]=='3')
            printf("%d\n",E(t,l+2,0));
        fgets(l,32,stdin);
	}
}