Cod sursa(job #239178)

Utilizator free2infiltrateNezbeda Harald free2infiltrate Data 4 ianuarie 2009 12:37:49
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <stdio.h>
#include <string.h>

struct trie
{
int info,nr;
trie *urm[26];
};
trie *x;

char s[21];

void add()
{
int m=strlen(s),i;
trie *A;
A=x;
for (i=0;i<m;i++)
{
if (x->urm[s[i]-'a']==NULL) {
                            trie *q;
                            q = new trie;
                            q->info = 0;
                            q->nr=1;
                            for (int j = 0;j<26;j++) q->urm[j]=NULL;
                            x->urm[s[i]-'a'] = q;
                            x = q;
                            }
else x=x->urm[s[i]-'a'],x->nr++;
}
x->info++;
x=A;
}

void del()
{
int m = strlen(s),i;
trie *A;
A=x;
for (i=0;i<m;i++) A = A->urm[s[i]-'a'],A->nr--;
A->info--;
}

FILE *out = fopen("trie.out","w");

void part()
{
int m = strlen(s),i;
trie *A;
A = x;
for (i=0;i<m && A!=NULL;i++) A = A->urm[s[i]-'a'];
if (A!=NULL) fprintf(out,"%d\n",A->info);
else fprintf(out,"0\n");
}

void prefix()
{
int m=strlen(s),i,nr=0;
trie *A;
A=x;
for (i=0;i<m && A!=NULL;i++) {
                                A = A->urm[s[i]-'a'];
                                if (A!=NULL) if (A->nr) nr++;
                             }
fprintf(out,"%d\n",nr);
}

int main()
{
FILE *in = fopen("trie.in","r");
x = new trie;
x->info = 0;
for (int i = 0;i<26;i++) x->urm[i] = NULL;

int n;

while (!feof(in))
{
fscanf(in,"%d %s\n",&n,s);
if (n==0) add();
else if (n==1) del();
else if (n==2) part();
else prefix();
}
}