HDU1247Hat’s Words(字典树)
题目链接。
解题报告:
静态分配是比动态分配省时的。
静态分配耗时:
动态分配耗时:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXN 26 typedef struct TrieNode{ int flag; struct TrieNode *next[MAXN]; }TrieNode; TrieNode mem[500000]; int pn; TrieNode *CreateTrieNode(){ TrieNode *p; int i; p = &mem[pn++]; p->flag = 0; for(i=0; i<MAXN; i++) p->next[i] = NULL; return p; } int InsertTrie(TrieNode **T, char *s){ TrieNode *p; if(!(p = (*T))) p = (*T) = CreateTrieNode(); int i=0, k, len; len = strlen(s); for(i=0; i<len; i++){ k = s[i] - 'a'; if(!p->next[k]) {p->next[k] = CreateTrieNode();} p = p->next[k]; } p->flag = 1; return 1; } int SearchTrie(TrieNode *T, char *s){ TrieNode *p; if(!(p = T)) return 0; int i, k; for(i=0; s[i]; i++){ k = s[i] - 'a'; if(!p->next[k]) return 0; p = p->next[k]; } if(p->flag) return 1; else return 0; } char str[120010][20]; int main(){ TrieNode *T = NULL, *p; int n=0, i, j, len; while(scanf("%s", str[n]) == 1){InsertTrie(&T, str[n]); n++;} for(i=0; i<n; i++){ len = strlen(str[i]); if(len < 2) continue; p = T; char *s = str[i]; for(j=0; j<len-1; j++){ int k = s[j] - 'a'; p = p->next[k]; if(p->flag){ if(SearchTrie(T, s+j+1)){ printf("%s\n", str[i]); break; } } } } return 0; }