题目名称 | 51. [NOIP 2000PJ]单词接龙 |
---|---|
输入输出 | dcjl.in/out |
难度等级 | ★☆ |
时间限制 | 1000 ms (1 s) |
内存限制 | 128 MiB |
测试数据 | 9 |
题目来源 | IM_ask 于2008-07-07加入 |
开放分组 | 全部用户 |
提交状态 | |
分类标签 | |
分享题解 |
通过:330, 提交:683, 通过率:48.32% | ||||
Riolu | 100 | 0.000 s | 0.00 MiB | C++ |
Furyton | 100 | 0.000 s | 0.00 MiB | C++ |
king'back | 100 | 0.000 s | 0.00 MiB | C++ |
king'back | 100 | 0.000 s | 0.00 MiB | C++ |
521 | 100 | 0.000 s | 0.00 MiB | C++ |
AAAAAAAAAA | 100 | 0.000 s | 0.00 MiB | C++ |
Regnig Etalsnart | 100 | 0.000 s | 0.00 MiB | C++ |
Jobs.T | 100 | 0.000 s | 0.00 MiB | C++ |
leon | 100 | 0.000 s | 0.00 MiB | C++ |
乐未殇 | 100 | 0.000 s | 0.00 MiB | C++ |
本题关联比赛 | |||
练习赛 |
关于 单词接龙 的近10条评论(全部评论) | ||||
---|---|---|---|---|
结果一开O2就过了
| ||||
| ||||
一开始狂想dp,然而图不是DAG,结果竟是暴搜......
| ||||
单词里不单只有小写字母!!单词里不单只有小写字母!!单词里不单只有小写字母!!重要的事情说三遍!!!!
NewBee
2016-08-04 18:58
10楼
| ||||
回复 @Rapiz :
包含的意思是在接上后长度不增加 | ||||
| ||||
竟然因为没有输出文件而没能一遍过。。,我果然还是太蒟蒻了Orz...
| ||||
求解第一个点
in: 1 ans: 15 它的意思是最长龙为envelopenvelope 但envelope显然包含它自身,所以根据题意是不能相连的。求解释? - - - AC辣不管怎么样,把单词错1...k位比较,如果匹配并可以让龙变长,接龙就行了。 | ||||
#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; } | ||||
Orzz一楼大神。一句话点醒梦中人
|
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连。
输入的第一行为一个单独的整数n (n<=20)表示单词数,以下n行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在.
只需输出以此字母开头的最长的“龙”的长度。
5 at touch cheat choose tact a
23
连成的“龙”为atoucheatactactouchoose。