| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 863 人关注过本帖
标题:求助合成字符串的查找算法
只看楼主 加入收藏
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
 问题点数:0 回复次数:7 
求助合成字符串的查找算法

Compound Words

--------------------------------------------------------------------------------

Time limit: 1sec. Submitted: 102
Memory limit: 32M Accepted: 26

Source : Waterloo ACM Programming Contest Sep 28, 1996

--------------------------------------------------------------------------------

You are to find all the two-word compound words in a dictionary. A two-word compound 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 120,000 words.


Output

Your output should contain all the compound words, one per line, in alphabetical order.

Sample Input

a
alien
born
less
lien
never
nevertheless
new
newborn
the
zebra

Sample Output
alien
newborn

题目大意就是先输入单词,输入结束后输出词典中所有的合成词.
我写了一个,用哈希表写的,time limited,晕了,想请教下大家有什么更好的方法没,谢谢!
以下是我的代码,已经超时...

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define PRIME 25013
typedef struct NODE
{
int name;
struct NODE *next;
}Word;
bool tag[PRIME];
char s[120000][40];
Word a[PRIME];
int hash(char *p)
{
unsigned int h=0, g;
for(; *p; ++p)
{
h = (h<<4) + *p;
if((g = (h & 0xf0000000)))
{
h = h ^ (g >> 24);
h = h ^ g;
}
}
return h % PRIME;
}
bool search(int inpos,char temp[])
{
if(tag[inpos]==false)
return false;
else
{
Word *point=a+inpos;
while(point)
{
if(strcmp(s[point->name],temp)==0)
return true;
else point=point->next;
}
return false;
}
}
int main()
{
int i=0,j,k,pos,len;
char temp[40];
while(scanf("%s",s[i])!=EOF)
{
pos=hash(s[i]);
if(tag[pos]==false)
{
tag[pos]=true;
a[pos].name=i;
a[pos].next=NULL;
}
else
{
Word *ptr=(Word *)malloc(sizeof(Word));
ptr->next=NULL;
ptr->name=i;
Word *q=a+pos;/*可能有问题*/
while(q->next)
q=q->next;
q->next=ptr;
}
i++;
}
for(k=0;k<i;k++)
{
len=strlen(s[k]);
for(j=1;j<len-1;j++)
{
memccpy(temp,s[k],'\0',j);
*(temp+j)='\0';
if(search(hash(temp),temp))
{
sprintf(temp,"%s",s[k]+j);
if(search(hash(temp),temp))
{
printf("%s\n",s[k]);
break;
}
}
}
}
return 0;
}
已修改为可ac的代码.

[此贴子已经被作者于2006-12-1 23:45:43编辑过]

搜索更多相关主题的帖子: 算法 字符 
2006-11-30 21:21
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
忘了说明下,只输出由两个单词合成的单词就可以了,不输出由3个或3个以上单词合成的单词.
麻烦大家了...

对不礼貌的女生收钱......
2006-11-30 21:45
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
呃,没人来.....
救命啊,谁帮我,结贴后有10000金币献上~~~

对不礼貌的女生收钱......
2006-12-01 13:00
cwande
Rank: 2
等 级:新手上路
威 望:3
帖 子:333
专家分:0
注 册:2006-8-18
收藏
得分:0 

你的代码复杂度很高诶,
O(i*i)i=120000,
超时是必然的吧...


汗,都懒得写代码了.......... cheat了一个威望,哈.....
2006-12-01 14:23
cwande
Rank: 2
等 级:新手上路
威 望:3
帖 子:333
专家分:0
注 册:2006-8-18
收藏
得分:0 

可以二分查找试试...
1.对所有单词进行排序(n*logn)
2.遍历每个单词,穷举把它分为两个单词的所有情况,然后进行二分查找,
(n*len*log(n))len为单词的长度..
复杂度会比你的好一些...


汗,都懒得写代码了.......... cheat了一个威望,哈.....
2006-12-01 14:33
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
以下是引用cwande在2006-12-1 14:33:40的发言:

可以二分查找试试...
1.对所有单词进行排序(n*logn)
2.遍历每个单词,穷举把它分为两个单词的所有情况,然后进行二分查找,
(n*len*log(n))len为单词的长度..
复杂度会比你的好一些...

刚下课回来,呵呵,您上次已经帮我一次了,还没好好谢您呢!
您的这个想法再加上哈希查找字符串应该可以,我试试,谢谢!


对不礼貌的女生收钱......
2006-12-01 16:18
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
呵呵,谢谢啊!过了,两两合并确实不好,按您的想法,拆分每个单词就过了,3Q!
回头送你10000金币!

你去水区开个出售贴,我给你10000金币!

[此贴子已经被作者于2006-12-1 16:43:12编辑过]


对不礼貌的女生收钱......
2006-12-01 16:39
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 

既然您不要,那我只好收起来了,呵呵,再次谢谢啦!


对不礼貌的女生收钱......
2006-12-01 20:31
快速回复:求助合成字符串的查找算法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.051393 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved