洛谷P1019 单词接龙题解(超详细注释)

https://www.luogu.org/problem/P1019

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
char s[50][15];
int check(int x,int y)
{
    for(int i=strlen(s[x])-1;i>=0;i--)//从后往前比,这样能够找到最小的重合
    {
        int j=i;
        int k=0;//第一个单词x从i往最后比,第二个单词从头开始比
        while(s[x][j]==s[y][k]&&j<strlen(s[x])&&k<strlen(s[y]))//如果两个单词的对应位置相同并且都没有出去(过了最大的长度)
        {
            j++;
            k++;//那么都到下一位
        }
        if(j==strlen(s[x]))return strlen(s[x])-i;//如果出来的时候第一个单词已经比完了,就说明可以匹配上了,返回重合的长度
    }
    return 0; 
}
int n;
int vis[30];
int ans;
int f[105][105];
void dfs(int len,int wz)
{
    for(int i=1;i<=n;i++)
    {
        int tmp=f[wz][i];//再次把两个单词之间的连接长度取出
        if(vis[i]!=2&&tmp)/如果用了没过两次还能连,就连上试试
        {
            vis[i]++;//用了一次
            dfs(len+strlen(s[i])-tmp,i);//长度变成了新连接上的单词的长度减去两个单词重合的长度,龙的最后一个单词变成了i
            vis[i]--;//恢复现场
        }
    }
    ans=max(ans,len);//每次都要更新
}
void init()
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            int tmp=check(i,j);//检查两个单词的重合程度
            if(tmp&&tmp!=strlen(s[i])&&tmp!=strlen(s[j]))//如果两个单词有重合并且不是一个完全包括了另外一个
            {
                f[i][j]=tmp;//那么就可以记录下来了
            }
        }
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%s",s[i]); 
    } 
    init();//预处理,将每两个单词之间能不能接,如果能接,接了多长记录下来
    char head;
    cin>>head;//读入龙头
    for(int i=1;i<=n;i++)
    {
        if(s[i][0]==head)//如果有一个单词可以接到脖子位置
        {
            vis[i]++;//那么这个单词首先被用了一次
            dfs(strlen(s[i]),i);//从脖子长度(包含了头),脖子在零件库s中的位置开始
            vis[i]--;//别忘了这里的返回现场也不能疏忽
        }
    }
    printf("%d\n",ans);
    return 0;
}
全部评论

相关推荐

行云流水1971:这份实习简历的优化建议: 结构清晰化:拆分 “校园经历”“实习经历” 板块(当前内容混杂),按 “实习→校园→技能” 逻辑排版,求职意向明确为具体岗位(如 “市场 / 运营实习生”)。 经历具象化:现有描述偏流程,需补充 “动作 + 数据”,比如校园活动 “负责宣传” 可加 “运营公众号发布 5 篇推文,阅读量超 2000+,带动 300 + 人参与”;实习内容补充 “协助完成 XX 任务,效率提升 X%”。 岗位匹配度:锚定目标岗位能力,比如申请运营岗,突出 “内容编辑、活动执行” 相关动作;申请市场岗,强化 “资源对接、数据统计” 细节。 信息精简:删减冗余表述(如重复的 “负责”),用短句分点,比如 “策划校园招聘会:联系 10 + 企业,组织 200 + 学生参与,到场率达 85%”。 技能落地:将 “Office、PS” 绑定经历,比如 “用 Excel 整理活动数据,输出 3 份分析表;用 PS 设计 2 张活动海报”,避免技能单独罗列。 优化后需强化 “经历 - 能力 - 岗位需求” 的关联,让实习 / 校园经历的价值更直观。 若需要进一步优化服务,私信
实习,投递多份简历没人回...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务