Cod sursa(job #308825)

Utilizator mlazariLazari Mihai mlazari Data 28 aprilie 2009 18:24:21
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include<stdio.h>
#include<string.h>

const int nmax='z'-'a'+1;

struct trie {
  int cnt,nf;
  trie* f[nmax];
  trie() {
    cnt=nf=0;
    for(int i=0;i<nmax;i++) f[i]=NULL;
  }
} *p=new trie;

int op;
char w[20];

void adauga(char w[]) {
  trie *q=p;
  int l=strlen(w);
  for(int i=0;i<l;i++) {
    if(!q->f[w[i]-'a']) q->f[w[i]-'a']=new trie;
    q=q->f[w[i]-'a'];
    q->nf++;
  }
  q->cnt++;
}

void sterge(char w[]) {
  trie *q=p;
  int l=strlen(w);
  for(int i=0;i<l;i++) {
    if(q->f[w[i]-'a']->nf==1) {
      q->f[w[i]-'a']=NULL;
      return;
    }
    q=q->f[w[i]-'a'];
    q->nf--;
  }
  q->cnt--;
}

int nrcuv(char w[]) {
  trie *q=p;
  int l=strlen(w),i=0;
  while((i<l)&&q->f[w[i]-'a']) q=q->f[w[i++]-'a'];
  if(q) return q->cnt; else return 0;
}

int lungpref(char w[]) {
  trie *q=p;
  int l=strlen(w),i=0;
  while((i<l)&&q->f[w[i]-'a']) q=q->f[w[i++]-'a'];
  return i;
}

int main() 
{
    freopen("triex.in","r",stdin);
    freopen("trie.out","w",stdout);
    while(!feof(stdin)) {
      scanf("%d %s",&op,w);
      switch(op) {
        case 0: adauga(w); break;
        case 1: sterge(w); break;
        case 2: printf("%d\n",nrcuv(w)); break;
        case 3: printf("%d\n",lungpref(w)); break;
      }
    }
    fclose(stdout);
    return 0;
}