题三.  单词接龙                27分)

 

 问题描述   

单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连。

     

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

     

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

       :

输入

5

at

touch

cheat

choose

tact

a

输出

23           (连成的“龙”为atoucheatactactouchoose)

【思路】

回溯法。

可以离线求出j接在i之后的重叠部分c[i][j],这样就可以把序列的尾巴u以及序列的长度len作为状态搜索,否则还要以string为状态搜索。

【代码】

 #include<iostream>
#include<cstring>
using namespace std; const int maxn = +;
int n;
int c[maxn][maxn];
int x[maxn],A[maxn]; //标记//序列
string words[maxn];
int wordslen[maxn];
int ans=; //计算a前b后的重叠长度
//substr截取字符串
int calc(string a,string b) {
int lena=a.size(),lenb=b.size();
int len=min(lena,lenb);
for(int l=;l<=len-;l++) { //len-1不能包含 //且重叠部分尽量小 从小到大枚举
if(a.substr(lena-l,l)==b.substr(,l))
return l;
}
return ;
} void dfs(int u,int len) {
ans=max(ans,len);
for(int v=;v<n;v++) if(x[v]< && c[u][v]) {
x[v]++;
dfs(v,len+wordslen[v]-c[u][v]);
x[v]--;
}
}
int main() {
ios::sync_with_stdio(false);
cin>>n;
for(int i=;i<n;i++){
cin>>words[i]; wordslen[i]=words[i].size();
}
for(int i=;i<n;i++) for(int j=;j<n;j++) //自己可能与自己重叠
c[i][j]=calc(words[i],words[j]);
char ch; cin>>ch;
for(int i=;i<n;i++) if(words[i][]==ch) {
x[i]++; dfs(i,wordslen[i]); x[i]--;
}
cout<<ans;
return ;
}

NOIP2000 单词接龙的更多相关文章

  1. NOIP2000单词接龙[DFS]

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...

  2. Noip2000 T3 单词接龙

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...

  3. [NOIP2000] 提高组 洛谷P1019 单词接龙

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...

  4. 洛谷——P1019 单词接龙(NOIP2000 T3)

    https://www.luogu.org/problem/show?pid=1019#sub 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母, ...

  5. NOIP2000提高组 单词接龙

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙" ...

  6. 洛谷 P1019 单词接龙 Label:dfs

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...

  7. 洛谷 P1019 单词接龙【经典DFS,温习搜索】

    P1019 单词接龙 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在 ...

  8. [openjudge-搜索]单词接龙

    题目描述 描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙&q ...

  9. 洛谷P1019:单词接龙(DFS)

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙" ...

随机推荐

  1. php获取汉字首字母的函数

    本文介绍用php实现汉字转化为首字母的方法,主要功能是:功能明确,易于修改维护和扩展: 英文的字串:不变返回(包括数字):中文字符串:返回拼音首字符: 中英混合串: 返回拼音首字符和英文. 网上的方法 ...

  2. CentOS 最小化安装后安装桌面

    通过yum的方式安装: yum groupinstall -y   "Desktop"   "Desktop Platform"   "Desktop ...

  3. 【python】Python 3 +pycharm中文支持解决方案

    使用环境:window10 + python 3.5.1 方法:在代码前端增加代码:# -*-coding:gbk-*-

  4. WPF学习笔记2——XAML之2

    三.事件处理程序与代码隐藏 例如,为一个Page添加一个Button控件,并为该Button添加事件名称Button_Click: <Page xmlns="http://schema ...

  5. org

    controller层单元测试报错 org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of ...

  6. 一步步学习NHibernate(3)——NHibernate增删改查

    请注明转载地址:http://www.cnblogs.com/arhat 在上一章中,我们配置了以下NHibernate的运行环境, 并介绍了NHibernate的中两个非常中重要的接口"I ...

  7. BZOJ 3983 Takeover Wars 解题报告

    我猜了一个结论,能合并就合并,到了必须要敌对交易的时候才进行敌对交易. 然后合并的话,肯定是拿最大的两个去合并. 至于敌对交易,肯定是干掉对方最大的公司才是有意义的. 于是各种分类讨论...看代码好了 ...

  8. pmtest1.asm pmtest2.asm pmtest5.asm 这几个比较重要.

    读代码时注意Label后面的文字:desc表示是描述符,seg表示是段 pmtest1.asm 主要讲进入保护模式 http://www.cnblogs.com/wanghj-dz/archive/2 ...

  9. 一个CLI的 的例子

    1)这是CLI 调用HTTPOST例子 #using <System.dll> using namespace System;using namespace System::Net;usi ...

  10. ArcGIS Engine生成等值线(C#)

    原文:ArcGIS Engine生成等值线(C#) 本文介绍c#写的利用ArcGIS Engine生成等值线的方法.c#写的根据雨量站的降雨量值内插出降雨量等值线的功能.做几点说明:根据离散点生成等值 ...