Hat’s Words
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 12198 Accepted Submission(s): 4351
You are to find all the hat’s words in a dictionary.
Only one case.
a ahat hat hatword hziee word
ahathatword
题意:给很多个单词,求出其中由两个单词组成的单词。按照字典树输出
思路:给出的单词都是按照字典树排序的,先把所有单词存入字典树中,然后枚举所有单词即可。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef struct Tree { struct Tree *next[26]; int v; }; Tree *root; char ma[50010][30]; void update(char *a) { Tree *p=root,*q; for(int i=0;i<strlen(a);i++) { int j=a[i]-'a'; if(p->next[j]==NULL) { q=new Tree; for(int k=0;k<26;k++) q->next[k]=NULL; q->v=0; p->next[j]=q; } p=p->next[j]; } p->v=-1; } int finds(char *a) { int s[5000]; Tree *p=root; int t=0; int len=strlen(a); for(int i=0;i<len;i++) { int j=a[i]-'a'; if(p->next[j]==NULL) break; p=p->next[j]; if(p->v==-1) s[t++]=i; } for(int i=0;i<t;i++) { p=root; int w=s[i]; for(int k=w+1;k<len;k++) { int j=a[k]-'a'; if(p->next[j]==NULL) break; p=p->next[j]; if(k==len-1&&p->v==-1) return 1; } } return 0; } int main() { char op[30]; root=new Tree; for(int i=0;i<26;i++) root->next[i]=NULL; root->v=0; int t=0; while(scanf("%s",ma[t])!=EOF) { update(ma[t]); t++; } for(int i=0;i<t;i++) if(finds(ma[i])) printf("%s\n",ma[i]); return 0; }