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单词接龙的主要内容,如果未能解决你的问题,请参考以下文章

搜索单词接龙 luogu-1019

luogu 1019 单词接龙 dfs细节

luogu P1019 单词接龙

luogup1019 单词接龙

洛谷P1019——单词接龙(DFS暴力搜索)

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