Luogu_1019单词接龙
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Luogu_1019单词接龙相关的知识,希望对你有一定的参考价值。
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连。
题目链接:https://www.luogu.org/problem/show?pid=101#include<cstdio>#include<time.h>
#include<algorithm> #include<cstdlib> #include<iostream> #include<vector> #include<queue> #include<cstring> using namespace std; typedef long long LL; const int maxn=100+5; const int maxnn=1000; int ans=0,n;int vis[20]; int len[20],match[21][21]; string s[20]; void dfs(int num,int sum) { int flag=true; vis[num]++; for(int i=0;i<n;i++) { if(vis[i]!=2){ if(match[num][i]){ dfs(i,sum+len[i]-match[num][i]);flag=false; } } } if(flag)ans=max(ans,sum); vis[num]--; } int main() { memset(vis,0,sizeof(vis)); memset(len,0,sizeof(len));//len其实是多余的-s.size()就可以了 memset(match,0,sizeof(match)); cin>>n; for(int i=0;i<n;i++){ cin>>s[i]; len[i]=s[i].size(); } char sta; cin>>sta; // clock_t sta_c=clock();
//每两个字母匹配
//i:=前字符,j:=后字符 int l,i,j,k,t; for(i=0;i<n;i++) for(j=0;j<n;j++){ for(k=len[i]-1;k>=0;k--){ t=len[i]-k; if(t>len[j])break; for(l=0;l<t;l++){ if(s[i][k+l]!=s[j][l])break; } if(l==t){ match[i][j]=l;//重叠字符最少,第一次碰到就可以了 break; } } } for(i=0;i<n;i++){ if(s[i][0]==sta) dfs(i,len[i]); } cout<<ans<<endl; // clock_t end_c=clock(); // cout<<"Running Time is:"<<static_cast<double>(end_c-sta_c)/CLOCKS_PER_SEC*1000<<"ms"<<endl; return 0; }
以上是关于Luogu_1019单词接龙的主要内容,如果未能解决你的问题,请参考以下文章