标签:hdoj
正解是字典树,运用链表实现的一种数据结构,构建 方式和紫书上的二叉树差不多。因为这道题的内存给的比较紧,所以需要解决内存问题,但是如果递归释放内存会导致效率低下,解决方案是开一个内存池(数组),每次更新下标就可以重复利用了。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int T,n,k; struct pa{ char s[15]; int len; }; bool cmp(pa a,pa b){ return a.len>b.len; } struct trie{ trie *next[15]; }; trie *root; trie all_trie[1000000]; bool built(char *s,int len) { bool ok = true; trie *p = root, *q; for(int i=0;i<len;i++){ int id = s[i]-'0'; if(p->next[id]==NULL) { ok = false; q = &all_trie[k++]; for(int j=0;j<10;j++) q->next[j] = NULL; p->next[id] = q; p = p->next[id]; } else { p = p->next[id]; } } return ok; } int main(){ scanf("%d",&T); while(T--){ scanf("%d",&n); pa s[10005]; k = 0; bool ok = true; root = &all_trie[k++]; for(int i=0;i<10;i++) root->next[i] = NULL; for(int i=0;i<n;i++){ scanf("%s",s[i].s); s[i].len = strlen(s[i].s); } sort(s,s+n,cmp); for(int i=0;i<n;i++) if(built(s[i].s,s[i].len)) { ok = false; break; } if(ok) printf("YES\n"); else printf("NO\n"); } return 0; }
标签:hdoj
原文地址:http://blog.csdn.net/weizhuwyzc000/article/details/45566825