码迷,mamicode.com
首页 > 其他好文 > 详细

Luogu_1019单词接龙

时间:2017-10-09 22:44:40      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:def   不能   一个   names   ide   false   match   set   重叠   

单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 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单词接龙

标签:def   不能   一个   names   ide   false   match   set   重叠   

原文地址:http://www.cnblogs.com/Gsimt/p/7642812.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!