Hat’s WordsTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 19043 Accepted Submission(s): 6722 Problem Description A hat’s word is a word in the dictionary that is the concatenation of exactly two other words in the dictionary.
Input Standard input consists of a number of lowercase words, one per line, in alphabetical order. There will be no more than 50,000 words.
Output Your output should contain all the hat’s words, one per line, in alphabetical order.
Sample Input
a ahat hat hatword hziee word
Sample Output
ahat hatword
Author 戴帽子的
Recommend Ignatius.L | We have carefully selected several similar problems for you: 1298 1800 2846 1305 2222
|
题意:给定一序列的单词按照字典序输入,要求某些单词是由这其中的其它两个单词拼接而成的单词按照字典序输出。
思路:建立一棵字典树,然后每个单词枚举所有拆分情况查找一下字典树即可。
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+5;
int trie[maxn][26],vis[maxn],tot;
int root,len;
char s[maxn][150];
void inst(char s[])
{
root=0;
int len=strlen(s);
for(int i=0;i<len;i++)
{
int id=s[i]-'a';
if(!trie[root][id]) trie[root][id]=++tot;
root=trie[root][id];
}
vis[root]=1;
}
int srch(char s[])
{
root=0;
int len=strlen(s);
for(int i=0;i<len;i++)
{
int id=s[i]-'a';
if(!trie[root][id]) return 0;
root=trie[root][id];
}
return vis[root];
}
int main()
{
int cnt=0;
char a[150],b[150];
while(scanf("%s",s[cnt])!=EOF)
{
inst(s[cnt]);
cnt++;
}
for(int i=0;i<cnt;i++)
{
len=strlen(s[i]);
for(int j=0;j<len;j++)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
strncpy(a,s[i],j);
strncpy(b,s[i]+j,len-j);
if(srch(a)&&srch(b))
{
printf("%s\n",s[i]);
break;
}
}
}
}