HDU-1247 Hat’s Words (暴力)Trie树
Posted 00isok
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU-1247 Hat’s Words (暴力)Trie树相关的知识,希望对你有一定的参考价值。
<题目链接>
题目大意:
给你一些单词,要求输出将该单词完全分成前、后两个单词之后,若这两个单词都在单词库中出现,则输出该单词。
解题分析:
将每个单词的每一位能够拆分的位置全部暴力枚举一遍,若拆分后的两个单词都在单词库中,则直接输出该单词即可,拆分单词的时候用strncpy()函数比较方便。
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 6 const int M = 5e4+10; 7 char word[M][100]; 8 9 struct Node{ 10 bool flag; 11 Node *next[26]; 12 Node(){ 13 flag=false; 14 for(int i=0;i<26;i++) 15 next[i]=NULL; 16 } 17 }; 18 Node *root=new Node; 19 Node *now,*newnode; 20 void Insert(char *str){ 21 now=root; 22 for(int i=0;str[i];i++){ 23 int to=str[i]-‘a‘; 24 if(now->next[to]==NULL){ 25 now->next[to]=new Node; 26 } 27 now=now->next[to]; 28 } 29 now->flag=true; //标记该节点为单词的结尾 30 } 31 bool search(char *str){ 32 now=root; 33 for(int i=0;str[i];i++){ 34 int to = str[i]-‘a‘; 35 if(now->next[to]==NULL)return false; 36 now=now->next[to]; 37 } 38 return now->flag; 39 } 40 void delete(Node *rt){ 41 for(int i=0;i<26;i++) 42 if(rt->next[i]!=NULL) 43 delete(rt->next[i]); 44 delete(rt); 45 } 46 int main(){ 47 int cnt=0; 48 while(gets(word[++cnt])&&strlen(word[cnt])) 49 Insert(word[cnt]); 50 for(int i=1;i<=cnt;i++){ 51 int len=strlen(word[i]); 52 for(int j=0;j<len;j++){ 53 char s1[110],s2[110]; 54 strncpy(s1,word[i],j+1),s1[j+1]=‘