Cod sursa(job #1204534)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 3 iulie 2014 10:56:08
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
FILE *f=fopen("trie.in","r");
FILE *g=fopen("trie.out","w");
bool ok=true;

struct trie{int cnt;int nrfii;
            trie *fii[26]={0};
            trie() {memset(fii,0,26);
                    cnt=0;nrfii=0;};
            };

trie *t=new trie;

inline void update(char s[25],int val)
{int i=0,lit=0;
trie *p=t;
while (i<strlen(s)) {lit=s[i]-'a';
                     if (p->fii[lit]==NULL) {trie *k=new trie;
                                             p->nrfii+=val;
                                             p->fii[lit]=k;
                                             }
                     p=p->fii[lit];
                     i++;
                     }
p->cnt+=val;
}
inline void caut(char s[25])
{int i=0,lit=0;
trie *p=t;
while (i<strlen(s)) {lit=s[i]-'a';
                     if (p->fii[lit]==NULL) {fprintf(g,"0\n");
                                             return;
                                             }
                     p=p->fii[lit];
                     i++;
                     }
fprintf(g,"%d\n",p->cnt);
}
inline int ma(char s[25])
{int i=0,maxim=0,lit=0;
trie *p=t;
while (i<strlen(s)) {lit=s[i]-'a';
                     if (p->fii[lit]==NULL) {break;}
                     p=p->fii[lit];
                     i++;
                     if ((p->nrfii)!=0) maxim=i;
                     if ((p->cnt)!=0) maxim=i;
                     }

return maxim;
}

int main()
{int i,j,op,lit;
char s[25]={0};

while (ok==true) {fscanf(f,"%d",&op);
                  fill(s,s+25,0);
                  fscanf(f,"%s",&s);
                  if (s[0]==NULL) {ok=false;break;}

                  if (op==0) {update(s,1);
                              }else
                  if (op==1) {update(s,-1);
                              }else
                  if (op==2) {caut(s);
                              }else
                  if (op==3) {fprintf(g,"%d\n",ma(s));}
                  }
return 0;
}