Pagini recente » Cod sursa (job #1703817) | Cod sursa (job #1405054) | Cod sursa (job #694638) | Cod sursa (job #1312739) | Cod sursa (job #890681)
Cod sursa(job #890681)
#include <stdio.h> #include <string.h> struct nod{ int nr; nod * next[30]; }*First; int Convert(char c){ return c-'a'+1; } void Insert(nod *p,char s[30],int k){ int n=strlen(s); if(k>=n){ p->nr++; return; } int ac=Convert(s[k]); if(p->next[ac]==0){ nod *q=new nod; q->nr=0; memset(q->next,0,sizeof(p->next)); p->next[ac]=q; Insert(p->next[ac],s,k+1); } else Insert(p->next[ac],s,k+1); } int IsValidDelete(nod *p){ if(p->nr>0) return 0; int i; for(i=1;i<=26;i++) if(p->next[i]!=0) return 0; return 1; } int Delete(nod *p,char s[30],int k){ int n=strlen(s); if(k>=n){ p->nr--; if(p->nr<0) p->nr=0; return p->nr; } int ac=Convert(s[k]); int sw=Delete(p->next[ac],s,k+1); if(sw<1){ nod *q=p->next[ac]; if(IsValidDelete(q)){ p->next[ac]=0; delete q; return p->nr; } } return 1; } int Write(nod *p,char s[30],int k){ if(p==0) return 0; int n=strlen(s); if(k>=n){ return p->nr; } int ac=Convert(s[k]); return Write(p->next[ac],s,k+1); } int WritePrefix(nod *p,char s[30],int k){ if(p==0) return k-1; int n=strlen(s); if(k>=n){ return n; } int ac=Convert(s[k]); return WritePrefix(p->next[ac],s,k+1); } void Read(){ freopen("trie.in","r",stdin); freopen("trie.out","w",stdout); First=new nod; First->nr=0; memset(First->next,0,sizeof(First->next)); char s[30]; int nr; while(!feof(stdin)){ scanf("%d %s\n",&nr,s); if(nr==0){ Insert(First,s,0); } else if(nr==1){ Delete(First,s,0); } else if(nr==2){ printf("%d\n",Write(First,s,0)); } else if(nr==3){ printf("%d\n",WritePrefix(First,s,0)); } } fclose(stdin); fclose(stdout); } int main() { Read(); return 0; }
.