首页 > 代码库 > HDU 1247 Hat’s Words
HDU 1247 Hat’s Words
题意:给你一堆单词,要你输出其中能由其它2个单词构成的单词
思路:首先想到能不能合并2个单词,然后再去找这个单词库,看能不能找到该单词,但是再仔细想,发现行不通,时间为合并单词所需时间[n*(n-1)/2-1]*查找时间!n最大为50000!
那么我们能不能拆了一个单词呢?时间为n个(len[i]-1)*查找时间的和,单词最长的是1913(不现实),排除这个最长的是45个字母,那么我们最坏也就是 50000*44*查找时间的情况,况且也不可能出现这种情况
所以我们采用拆单词的方法!然后直接套模板!当然,这题有个小坑
AC代码:
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<stdlib.h> using namespace std; #define maxn 50005 char s[maxn][50]; typedef struct node { int isstr; int num; struct node *next[27]; }trienode,*trie; struct node *root; void Insert(char *s) { int i,len=strlen(s); trienode *p=root,*q; for(i=0;i<len;i++) { if(p->next[s[i]-'a']==NULL) { q=(struct node *)malloc(sizeof(struct node)); memset(q->next,NULL,sizeof(q->next)); q->num=1; q->isstr=0; p->next[s[i]-'a']=q; } else { p->next[s[i]-'a']->num++; } p=p->next[s[i]-'a']; } p->isstr=1; } int find(char *s) { int i,len=strlen(s); trienode *p=root,*q; for(i=0;i<len;i++) { if(p->next[s[i]-'a']==NULL) return 0; p=p->next[s[i]-'a']; } if(p->isstr==1) return 1; return 0; } int main() { int tot=0; //记录有多少个单词 int i,j; char str[50]; root=(struct node *)malloc(sizeof(struct node)); memset(root->next,NULL,sizeof(root->next)); root->isstr=0; root->num=0; while(scanf("%s",str)!=EOF) { strcpy(s[tot++],str); Insert(str); //建树 } for(i=0;i<tot;i++) //对总共有tot个单词进行拆的工作 { for(j=1;j<strlen(s[i]);j++) //拆 { char temp1[50]={'\0'}; char temp2[50]={'\0'}; strncpy(temp1,s[i],j); //拆单词的C函数 strncpy(temp2,s[i]+j,strlen(s[i])-j); if(find(temp1)&&find(temp2)) { printf("%s\n",s[i]); break; //这里很重要,防止再次打印,就是这里没注意果断地错了,找错找了半天=-=! } } } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。