hdu 1247 Hat’s Words(字典树)

来源:互联网 发布:淘宝网规则 编辑:程序博客网 时间:2024/05/21 19:50

题意:给你很多的单词,输出那些可以由其它的两个单词拼接起来的单词。

解法:先把所有单词插入到一个字典树中,然后暴力拆分每个单词,判断两段是不是都是单词,例如:abc  可以拆成 ab c和 a bc 分别判断是不是单词 如果两个都是单词就输出

#include<stdio.h>#include<string.h>#include<iostream>using namespace std;char s[50010][100];struct Node{Node  *child[26];int n;Node(){//初始化 n=0;memset(child,0,sizeof(child));}}; Node *root;void insert(char *s){Node *p=root,*t;int i,len;for(i=0;s[i];i++){int id=s[i]-'a';if(p->child[id]){p=p->child[id];}else{t=new Node();p->child[id]=t;p=t;}}p->n=1;//该结点是单词的尾}int search(char *s){int i,j;Node *p=root;for(i=0;s[i];i++){int id=s[i]-'a';if(p->child[id]){p=p->child[id];}else return 0;}if(p->n==1) return 1;//找到最后,并且是单词的else return 0;}int main(){int i,j,k,t;char str1[100],str2[100];root=new Node();k=0;while(gets(s[k])){//没有结束条件多组输入字符串的输入,可以这样写 insert(s[k]);k++;}for(i=0;i<k;i++){int len=strlen(s[i]);if(len>1){for(j=1;j<len;j++){//拆成两部分for(t=0;t<j;t++) str1[t]=s[i][t];str1[t]='\0';for(t=j;t<len;t++) str2[t-j]=s[i][t];str2[t-j]='\0';if(search(str1)&&search(str2)){printf("%s\n",s[i]);break;}}} }return 0;}


0 0