题意:从词典中找出由两个词组成的合成词。
思路:利用HASH建立词典,遍历所有词,分解每个词,若分解后的词都能找到,则输出。注意找到后break退出循环,否则可能多输出一遍。这里WA了3次。
#include<string.h>
#include<stdio.h>
#define MAX 1000003
char word[120000][50];
int head[MAX],next[MAX],num;
int hash(char s[])
{
int i,v=0;
for(i=0;i<strlen(s);i++)
{
v=v*3+(s[i]-'a'+1);
v%=MAX;
}
return v%MAX;
}
void Insert(char s[],int i)
{
int h,u;
h=hash(s);
u=head[h];
while(u)
{
u=next[u];
}
next[i]=head[h];
head[h]=i;
}
int isExist(char s[])
{
int h,u;
h=hash(s);
u=head[h];
if(!strcmp(s,word[u]))return u;
while(u)
{
if(!strcmp(s,word[u]))return u;
u=next[u];
}
return -1;
}
int main()
{
int i=0,j,flag;
char tmp[100];
while(gets(word[i])!=NULL)
{
Insert(word[i],i);
i++;
}
num=i;
for(i=0;i<num;i++)
{
if(word[i][1])
{
for(j=0;j<strlen(word[i])-1;j++)
{
strcpy(tmp,word[i]);
tmp[j+1]='\0';
if(isExist(tmp)!=-1&&isExist(word[i]+j+1)!=-1)
{
printf("%s\n",word[i]);
break;
}
}
}
}
return 0;
}