luogu P1019 单词接龙

一道深搜题

应该很早就做然而并没有

这跟成语接龙一点也不像不能为所欲为

然后需要注意一下

  • 相邻的两部分不能存在包含关系就是说如果存在包含关系,就不能标记为使用过。
  • 每个单词最多出现两次

这样提前先预处理一下每两个单词之间的重复部分

用sam[i][j]表示第i个单词后接第j个单词的重叠的部分

然后dfs,记得用vis标记一下该单词使用过几次

#include<cstdio>
#include<iostream>
#define sev en
using namespace std;

int n,ans,ret;
string a[30];
char ch;
int vis[30],sam[30][30];

int find(int x,int y){
    bool f = 1;
    int cnt = 0;
    for(int i = a[x].size() - 1;i >= 0;i--){//前一个从后开始
    for(int j = i;j < a[x].size();j++)
        if(a[x][j] != a[y][cnt++]){//后一个从前开始
        f = 0;
        break;
        }
    if(f == 1)
        return a[x].size() - i;//重叠部分
    cnt = 0;
    f = 1;
    }
    return 0;//一直没找到qaq
}

void dfs(int x){
    bool f = 0;
    for(int i = 1;i <= n;i++){
    if(vis[i] >= 2)
        continue;//只能用两次
    if(sam[x][i] == 0)
        continue;
    if(sam[x][i] == a[x].size() || sam[x][i] == a[i].size())//包含关系就跳
        continue;
    ans += a[i].size() - sam[x][i];
    vis[i]++;
    f = 1;
    dfs(i);
    ans -= (a[i].size() - sam[x][i]);
    vis[i]--;//常规操作
    }
    if(f == 0)
    ret = max(ret,ans);//记录最大
    return ;
}

int main(){
    scanf("%d",&n);
    for(int i = 1;i <= n;i++)
    cin >> a[i];//cin很慢尽管很方便www最好别用 我为什么用了这件事不要在意
    cin >> ch;
    for(int i = 1;i <= n;i++)
    for(int j = 1;j <= n;j++)
        sam[i][j] = find(i,j);//预处理
    for(int i = 1;i <= n;i++)
    if(a[i][0] == ch){//找开头
        vis[i]++;
        ans = a[i].size();
        dfs(i);
        vis[i] = 0;
    }
    printf("%d",ret);//完成辽~
    return 0;
}

itsomethingood

果然我太菜了

深搜好难啊啊啊啊

orz我jio的我能被搜索搞si

原文地址:https://www.cnblogs.com/sevenyuanluo/p/10779584.html

时间: 2024-10-11 06:59:59

luogu P1019 单词接龙的相关文章

luogu 1019 单词接龙 dfs细节

P1019 单词接龙 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连. 输入输出格式 输入格式: 输入的第一行为一个单独的整数n (n<=20)表示单词数,以下n 行每行有一个单词,

洛谷P1019 单词接龙

P1019 单词接龙 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连. 输入输出格式 输入格式: 输入的第一行为一个单独的整数n (n<=20)表示单词数,以下n 行每行有一个单词,

洛谷P1019单词接龙 搜索

洛谷P1019 单词接龙 这道题目 我用的是搜索 应为起点已经确认了,那就从这开始搜索,如果能接上去就接上去,回溯一下需要注意的就是一些细节问题,比方说不能被另一个单词完全覆盖等等 以及字符串是从零开始的问题 1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdlib> 5 #include <string> 6 #include <a

洛谷 P1019 单词接龙

P1019 单词接龙 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连. 输入输出格式 输入格式: 输入的第一行为一个单独的整数n (n<=20)表示单词数,以下n 行每行有一个单词,

【luogu】p1019 单词接龙

(碎碎念:初二的时候就开始写这道题,写了几天觉得啊好烦啊就不想写就放弃了,上初三之后终于抽出时间把这个题写完了 (搜索题要我狗命(缩成一团 题目链接: https://www.luogu.com.cn/problem/P1019 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙"中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和ast

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

https://www.luogu.org/problem/show?pid=1019#sub 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连. 输入输出格式 输入格式: 输入的第一

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

https://www.luogu.org/problem/show?pid=1019#sub 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙"中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连. 输入输

洛谷 P1019 单词接龙 深搜

题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙"中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连. 输入输出格式 输入格式: 输入的第一行为一个单独的整数n (n<=20)表示单词数,以下n 行每

P1019 单词接龙

题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连. 输入输出格式 输入格式: 输入的第一行为一个单独的整数n (n<=20)表示单词数,以下n 行每行有一个单词,输入的最后一行为一个单