1220:单词接龙

 

【题目描述】

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

【输入】

输入的第一行为一个单独的整数n(n≤20)表示单词数,以下n行每行有一个单词(只含有大写或小写字母,长度不超过20),输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在。

【输出】

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

【输入样例】

5
at
touch
cheat
choose
tact
a

【输出样例】

23

本蒟蒻表示这真的是普及的难度吗???翻阅ed无数大佬AC
转:

https://blog.csdn.net/weixin_40246008/article/details/87172366

// Created on 2020/2/6

/*#include 
#include 
#include 
#include 
#include 
#include 
#include */
#include 
#define A 500+5

using namespace std;

//int i,j,k;

const int maxn=INT_MAX;

const int idata=20+5;
string str[idata];
int Size[idata];//单词长度
short use[idata];//判断次数,单词可以使用2次
//bool judge[idata];
int ans=0;
char ch;
//int sum;

int t;

bool check(int judge,int first,int second)//judge为需要检查字母的个数
{
    register int i,j;
    for(i=judge,j=0 ; i>0,jans) ans=cnt;

    register int i,j;
    for(i=1;i<=t;i++)
    {
        if(use[i]>0)
        {
            for(j=1;j<=min(Size[n],Size[i])-1;j++)//将首字母相同的情况
                                                  //也就是字符串包含时排除
            {
                if(str[n][Size[n]-j]==str[i][0])//rfind,从右找到第一个与待连接单词首字母相同的字母
                {
                    if(check(j,n,i))
                    {
                        use[i]--;
                        dfs(i,cnt-j+Size[i]);
                        use[i]++;
                    }
                }
            }
        }
    }
}

int main()
{
    cin>>t;

    int i;
    for(i=1;i<=t;i++)
    {
        cin>>str[i];
        Size[i]=str[i].size();
        use[i]=2;
    }
    cin>>ch;


    for(i=1;i<=t;i++)
    {
        if(str[i][0]==ch)
        {
            use[i]--;
            dfs(i,Size[i]);
            use[i]++;
        }
    }

    cout<

关于rfind()函数使用:

https://blog.csdn.net/qq_42446432/article/details/88086259

你可能感兴趣的:(1220:单词接龙)