hdu 2846 字典樹
阿新 • • 發佈:2019-02-11
用指標版本在HDUOJ上的G++會超記憶體,用C++可以過。
用陣列版本在HDUOJ上的G++就可以過了。
指標版本和陣列版本其實用的記憶體理論上是等價的。
原來應該是HDUOJ的評測機是windows執行G++,編譯應該會有一些問題。
指標版本:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define maxn 26 struct Trie{ Trie * next[maxn]; int v; }; Trie * root; int cmp(const void * a1,const void * a2){ char * p1 = (char *)a1; char * p2 = (char *)a2; return strcmp(p1,p2); } void Init_Trie(){ root = (Trie *)malloc(sizeof(Trie)); for(int i=0;i<maxn;i++){ root -> next[i] = NULL; } } void Add_Trie(char * str){ Trie * p = root , * q; for(int i=0;str[i]!='\0';i++){ int id = str[i] - 'a'; if(p->next[id]==NULL){ q = (Trie *)malloc(sizeof(Trie)); q -> v = 0; for(int j=0;j<maxn;j++){ q -> next[j] = NULL; } p -> next[id] = q; p = p -> next[id]; } else { p = p -> next[id]; } } p -> v ++; } int Search_Trie(char * str){ Trie * p = root; for(int i=0;str[i]!='\0';i++){ int id = str[i] - 'a'; p = p -> next[id]; if(p==NULL){ return 0; } } return p -> v; } void Del_Trie(Trie * p){ for(int i=0;i<maxn;i++){ if(p->next[i])Del_Trie(p->next[i]); } free(p); } void Input(){ int n; char a[25],b[505][25]; while(~scanf("%d",&n)){ Init_Trie(); for(int ii=0;ii<n;ii++){ scanf("%s",a); int ki = 0; for(int i=0;i<strlen(a);i++){ for(int j=i;j<strlen(a);j++){ int k; for(k=i;k<=j;k++){ b[ki][k-i] = a[k]; } b[ki][k-i] = 0; ki++; } } qsort(b,ki,sizeof(b[0]),cmp); Add_Trie(b[0]); for(int i=1;i<ki;i++){ //if(ii==11)puts(b[i]); if(strcmp(b[i],b[i-1])) Add_Trie(b[i]); } } int m; scanf("%d",&m); for(int i=0;i<m;i++){ scanf("%s",a); printf("%d\n",Search_Trie(a)); } Del_Trie(root); } } void File(){ freopen("a.in","r",stdin); freopen("a.out","w",stdout); } int main(void){ // File(); Input(); return 0; }
陣列版本:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define maxn 26 int d[500000][maxn]; int value[500000]; int tot; int cmp(const void * a1,const void * a2){ char * p1 = (char *)a1; char * p2 = (char *)a2; return strcmp(p1,p2); } void Init_Trie(){ memset(d,0,sizeof(d)); memset(value,0,sizeof(value)); } void Add_Trie(char * str){ int t = 0; for(int i=0;str[i]!='\0';i++){ int id = str[i] - 'a'; if(d[t][id]==0){ d[t][id] = tot ++; t = d[t][id]; } else { t = d[t][id]; } } value[t] ++; } int Search_Trie(char * str){ int t = 0; for(int i=0;str[i]!='\0';i++){ int id = str[i] - 'a'; t = d[t][id]; if(t == 0){ return 0; } } return value[t]; } void Input(){ int n; char a[25],b[505][25]; while(~scanf("%d",&n)){ tot = 1; for(int ii=0;ii<n;ii++){ scanf("%s",a); int ki = 0; for(int i=0;i<strlen(a);i++){ for(int j=i;j<strlen(a);j++){ int k; for(k=i;k<=j;k++){ b[ki][k-i] = a[k]; } b[ki][k-i] = 0; ki++; } } qsort(b,ki,sizeof(b[0]),cmp); Add_Trie(b[0]); for(int i=1;i<ki;i++){ //if(ii==11)puts(b[i]); if(strcmp(b[i],b[i-1])) Add_Trie(b[i]); } } int m; scanf("%d",&m); for(int i=0;i<m;i++){ scanf("%s",a); printf("%d\n",Search_Trie(a)); } } } void File(){ freopen("a.in","r",stdin); freopen("a.out","w",stdout); } int main(void){ //File(); Input(); return 0; }