【C++心路历程32】【NOIP2000】单词接龙【图论爆搜最长链】

本文介绍了如何使用C++解决单词接龙问题,通过转化为图论中的最长路径来寻找以特定字母开头的最长单词链。文章提供了一个样例输入和输出,并讨论了两种解决方案,包括暴力枚举和图论方法,其中图论方法更优,能在n^2的时间复杂度内完成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【问题描述】

  单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母(不是单词),请你计算以这个字母开头的长度最长的“龙”,每个单词最多在“龙”中出现两次。
  要注意的是,两个单词接龙规则如下:
  1、如果第一个单词的后面的连续若干字母与第二个单词前面的连续若干字母依次相同,则这两个单词可以接龙,例如 beast 和 astonish ,如果接成一条龙则变为 beastonish。
  2、两个单词接成一条龙后,龙的长度要比两个单词的长度都长。例如单词 at 和 atide 接成一条龙后为atide,龙的长度与第二个单词相同,所以这两个单词不能接龙。而单词ababab和ababab,可以接成ababababab,但不能为ababab。
  3、接龙时,如果两个单词接龙后的单词有多种情况,要尽可能保证接龙后龙的长度最长。例如cabab和ababc,一定要接成cabababc,为而不是cababc。

【输入格式】

  输入的第一行为一个单独的整数n 表示单词数,以下n 行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在.

【输出格式】

  只需输出以此字母开头的最长的“龙”的长度

【输入样例】

5
at
touch
cheat
choose
tact
a

【输出样例】

23

【样例解释】

  最长的接龙是下面几个单词进行:
    at -> touch -> cheat -> tact -> tact -> touch -> choose
  连成长度为23的“龙”: atoucheatactactouchoose

【数据范围】

  50%的数据有:n<=5;
  100%的数据有:n<=10,每个单词的长度不超过40。
【分析】
1、暴力枚举各个单词的排列,并计算长度取最大值 .O(n!)
2、可以转化为图论,求有向图最长路径。在n^2的时间复杂度内连边单词,对于单词(a,b),边权为b的长度减去a,b重合长度,这样即可转化为一张有向图。 对于最后的起首字母做相同处理即可。
实现技巧:当然可以每个单词复制一遍࿰

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值