a ahat hat hatword hziee word
ahat hatword
Recommend
题意:判断一个单词能不能有两个单词组成,可以的话就输出。
题解:所有单词建成一颗字典树,单词插入结尾记录单词的个数,查询时直接暴力拆单词判断。
#include<cstring> #include<algorithm> #include<cstdio> #include<iostream> #include<cstdlib> #define N 50020 using namespace std; char s[N][42]; struct Trie { int num; struct Trie *nxt[26]; Trie() { num=0; for(int i=0; i<26; i++) { nxt[i]=NULL; } } }; void Trie_Inser(Trie *p,char s[]) { int i=0; Trie *q=p; while(s[i]) { int nx=s[i]-'a'; if(q->nxt[nx]==NULL) { q->nxt[nx]=new Trie; } i++; q=q->nxt[nx]; } q->num+=1; } bool Trie_Serch(Trie *p,char s[],int be,int en) { Trie *q=p; int i=be; while(i<=en) { int nx=s[i]-'a'; if(q->nxt[nx]==NULL)return false; q=q->nxt[nx]; i++; } if(q->num>0)return true; return 0; } int main() { //freopen("test.in","r",stdin); Trie *p=new Trie; int id=1; while(~scanf("%s",s[id])) { Trie_Inser(p,s[id]); id++; } for(int i=1; i<id; i++) { int len=strlen(s[i]); int be=0; if(len<=1)continue; for(int en=0; en<len-1; en++) { if(Trie_Serch(p,s[i],be,en)&&Trie_Serch(p,s[i],en+1,len-1)) { printf("%s\n",s[i]); break; } } } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/acm_baihuzi/article/details/46910219