题目名称 51. [NOIP 2000PJ]单词接龙
输入输出 dcjl.in/out
难度等级 ★☆
时间限制 1000 ms (1 s)
内存限制 128 MiB
测试数据 9
题目来源 GravatarIM_ask 于2008-07-07加入
开放分组 全部用户
提交状态
分类标签
搜索法 字符串 NOIP/CSP NP问题
分享题解
通过:330, 提交:683, 通过率:48.32%
GravatarRiolu 100 0.000 s 0.00 MiB C++
GravatarFuryton 100 0.000 s 0.00 MiB C++
Gravatarking'back 100 0.000 s 0.00 MiB C++
Gravatarking'back 100 0.000 s 0.00 MiB C++
Gravatar521 100 0.000 s 0.00 MiB C++
GravatarAAAAAAAAAA 100 0.000 s 0.00 MiB C++
GravatarRegnig Etalsnart 100 0.000 s 0.00 MiB C++
GravatarJobs.T 100 0.000 s 0.00 MiB C++
Gravatarleon 100 0.000 s 0.00 MiB C++
Gravatar乐未殇 100 0.000 s 0.00 MiB C++
本题关联比赛
练习赛
关于 单词接龙 的近10条评论(全部评论)
结果一开O2就过了
Gravatarlihaoze
2022-02-14 01:10 13楼
GravatarMoon_
2018-10-26 20:19 12楼
一开始狂想dp,然而图不是DAG,结果竟是暴搜......
Gravatar核糖核酸
2016-09-23 19:39 11楼
单词里不单只有小写字母!!单词里不单只有小写字母!!单词里不单只有小写字母!!重要的事情说三遍!!!!
GravatarNewBee
2016-08-04 18:58 10楼
回复 @Rapiz :
包含的意思是在接上后长度不增加
Gravatar森林
2016-08-04 18:38 9楼
Gravatar安呐一条小咸鱼。
2016-07-08 14:40 8楼
竟然因为没有输出文件而没能一遍过。。,我果然还是太蒟蒻了Orz...
Gravatarsxysxy
2016-06-20 20:42 7楼
求解第一个点
in:
1
envelope
e

ans:
15
它的意思是最长龙为envelopenvelope
envelope显然包含它自身,所以根据题意是不能相连的。求解释?
- - -
AC辣不管怎么样,把单词错1...k位比较,如果匹配并可以让龙变长,接龙就行了。
GravatarRapiz
2016-02-05 16:14 6楼
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<string>
#include<set>
#include<map>
#include<vector>
#include<queue>
#define maxn 45
using namespace std;
int i,j,k,m,n,ans=0,jie[maxn][maxn];
char c;
string a[maxn];
bool vis[maxn];
int lian(string a,string b){
int x=min(a.size(),b.size()),len=0;
if(a!=b&&a.substr(a.size()-x,x)==b.substr(0,x))return 0;
for(int i=1;i<x;i++){
string s1=a.substr(a.size()-i,i),s2=b.substr(0,i);
if(s1==s2){len=i;break;}
}
return len;
}
int dfs(int x){
int ans=a[x].size();
for(int i=0;i<2*n;i++){
if(!vis[i]&&jie[x][i]){
vis[i]=1;
ans=max(ans,(int)a[x].size()+dfs(i)-jie[x][i]);
vis[i]=0;
}
}
return ans;
}
int main(){
// freopen("0.txt","r",stdin);
freopen("dcjl.in","r",stdin);
freopen("dcjl.out","w",stdout);
cin>>n;
for(i=0;i<2*n;i+=2){cin>>a[i];a[i+1]=a[i];}
for(i=0;i<2*n;i++)
for(j=0;j<2*n;j++)jie[i][j]=lian(a[i],a[j]);
cin>>c;
for(i=0;i<2*n;i+=2){
if(a[i][0]==c){
vis[i]=1;
ans=max(dfs(i),ans);
vis[i]=0;
}
}
cout<<ans;
return 0;
}
GravatarAISS
2015-10-29 10:25 5楼
Orzz一楼大神。一句话点醒梦中人
GravatarDissolute丶Tokgo
2015-08-31 16:08 4楼

51. [NOIP 2000PJ]单词接龙

★☆   输入文件:dcjl.in   输出文件:dcjl.out   简单对比
时间限制:1 s   内存限制:128 MiB

【问题描述】

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

【输入格式】

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

【输出格式】

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

【输入样例】

5
at
touch
cheat
choose
tact
a

【输出样例】

23

【样例解释】

连成的“龙”为atoucheatactactouchoose。