UVA - 10391 - Compound Words

题意:从词典中找出由两个词组成的合成词。
思路:利用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;
}        
    


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值