a ahat hat hatword hziee word
ahat hatword 题意:输入一连串的 单词 组成的字典 输出字典中由两个其他单词组成的单词 构造字典树即可。。。 代码:#include<iostream> #include<cstdio> #include<cstring> using namespace std; struct node{ int last; //last用来判断是否为一个单词的最后一个字母 struct node *next[26]; node() //构造函数 { last=0; memset(next,NULL,sizeof(next)); } }*root; char str[50005][20]; int s=0; void insert_str(char *s) //构造字典树 { node *p=root; while(*s!='\0') { int d=*s-'a'; if(p->next[d]==NULL) { p->next[d]= new node(); p=p->next[d]; } else p=p->next[d]; s++; } p->last=1; return ; } int find2(char *s) { node *p=root; while(*s!='\0') { int d=*s-'a'; p=p->next[d]; if(p!=NULL) { if(p->last==1&&*(s+1)=='\0') //当后半部分为单词 且没有后缀 return 1; s++; } else return 0; } return 0; //重要 返回可能默认为1 } int find(char *s) { node *p=root; while(*s!='\0') { int d=*s-'a'; p=p->next[d]; if(p!=NULL) { if(p->last==1&&find2(s+1)) //当已经确认前半部分为一个单词 再确认后半部分是否为单词 return 1; s++; } else return 0; } return 0; } int main() { int i,j; root=new node(); // 根节点 while(scanf("%s",str[s])!=EOF) { insert_str(str[s]); s++; } for(i=0;i<s;i++) { if(find(str[i])) cout<<str[i]<<endl; } return 0; }
原文地址:http://blog.csdn.net/axuan_k/article/details/42122159