[NOIP2000 提高组] 单词接龙 题解

2024-04-25 00:48

本文主要是介绍[NOIP2000 提高组] 单词接龙 题解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

[NOIP2000 提高组] 单词接龙 题解

[NOIP2000 提高组] 单词接龙
这题不难,简单的dfs但需要极好的题目理解能力 本蒟蒻wa哭
需要注意的一个普通的点:每个单词都最多在“龙”中出现两次,相信大家都不会wa在这上面吧。
最重要的也是最坑的两个点来了:
一、在两个单词相连时,其重合部分合为一部分,例如 beast 和 astonish,接成一条龙则变为 beastonish。
如果你认为只要重合就会连接起来那么就错了。实际上两个单词合并时,合并部分取的是最小重叠部分。
二、另外相邻的两部分不能存在包含关系,例如 at 和 atide 间不能相连。
最开始我以为相同的单词也不能相连,但实际上的意思是当需要连起来时两个单词完全重叠才是不合法的。
比如envelope和envelope接龙,结果是:envelopenvelope,只取最小的重叠部分‘e’。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int vis[30],ans,n;//vis标记第i串字符使用次数 
char a[30][100];//存字符串 
int str[30];//记录第i串字符的长度 
int g[30][30];//第j个字符串接在第i个字符串后面增加的字符个数 ,当值为0时代表j不能接龙在i后 //坑点1:两个单词合并时,合并部分取的是最小重叠部分atat与tath接龙是atatath而不是atath 
void link()//g数组初始化 
{int i,j,k,F,t1,t2,t3,sum;memset(g,0,sizeof(g));for(i=0;i<n;i++){t1=str[i];for(j=0;j<n;j++){//if(i==j)continue;坑点2:自己可以接自己,但不能是完全重合的接,//比如envelope可以自己接自己,接起来为envelopenvelope//at就不合法,接起来为at自己没有变化,没有意义,还浪费一次接龙次数 t2=str[j];for(F=0;F<t2;F++){t3=t1-1, sum=0;if(a[j][F]==a[i][t3])for(k=F;k>=0;k--)//记录j字符与i字符重叠部分长度 {if(a[j][k]==a[i][t3--])	 sum++;else {sum=0;break;}}if(sum)break;}if(sum==t1||sum==t2||sum==0)g[i][j]=0;//当完全不重合以及完全重合时标记为0 else g[i][j]=str[j]-sum;}}
}void dfs(int sum,int now)//sum:字符长度 now上一个接龙单词的序号 
{for(int i=0;i<n;i++){if(vis[i]==2||!g[now][i])continue;//当单词使用不超过2次,且可以接龙时进行搜索 vis[i]++;dfs(sum+g[now][i],i);vis[i]--;}ans=max(ans,sum);//递归终止条件即找不到字符串接龙时 return ;
}int main()
{char c[10];scanf("%d",&n);for(int i=0;i<n;i++){scanf("%s",a[i]);str[i]=strlen(a[i]);}scanf("%s",c);link();ans=0;for(int i=0;i<n;i++)//寻找第一个接龙单词 {memset(vis,0,sizeof(vis));if(a[i][0]==c[0]){vis[i]++;dfs(str[i],i);}}printf("%d",ans);return 0;
}

这篇关于[NOIP2000 提高组] 单词接龙 题解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/933301

相关文章

如何提高Redis服务器的最大打开文件数限制

《如何提高Redis服务器的最大打开文件数限制》文章讨论了如何提高Redis服务器的最大打开文件数限制,以支持高并发服务,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录如何提高Redis服务器的最大打开文件数限制问题诊断解决步骤1. 修改系统级别的限制2. 为Redis进程特别设置限制

键盘快捷键:提高工作效率与电脑操作的利器

键盘快捷键:提高工作效率与电脑操作的利器 在数字化时代,键盘快捷键成为了提高工作效率和优化电脑操作的重要工具。无论是日常办公、图像编辑、编程开发,还是游戏娱乐,掌握键盘快捷键都能带来极大的便利。本文将详细介绍键盘快捷键的概念、重要性、以及在不同应用场景中的具体应用。 什么是键盘快捷键? 键盘快捷键,也称为热键或快捷键,是指通过按下键盘上的一组键来完成特定命令或操作的方式。这些快捷键通常涉及同

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

如何提高 GitHub 的下载速度

如何提高 GitHub 的下载速度 文章目录 如何提高 GitHub 的下载速度1. 注册账号2. 准备好链接3. 创建仓库4. 在码云上下载代码5. 仓库更新了怎么办 一般来说,国内的朋友从 GitHub 上面下载代码,速度最大是 20KB/s,这种龟速,谁能忍受呢? 本文介绍一种方法——利用“码云”,可以大大提高下载速度,亲测有效。 1. 注册账号 去“码云”注册一

C - Word Ladder题解

C - Word Ladder 题解 解题思路: 先输入两个字符串S 和t 然后在S和T中寻找有多少个字符不同的个数(也就是需要变换多少次) 开始替换时: tips: 字符串下标以0开始 我们定义两个变量a和b,用于记录当前遍历到的字符 首先是判断:如果这时a已经==b了,那么就跳过,不用管; 如果a大于b的话:那么我们就让s中的第i项替换成b,接着就直接输出S就行了。 这样

每日一练7:简写单词(含链接)

1.链接 简写单词_牛客题霸_牛客网 2.题目 3.代码1(错误经验) #include <iostream>#include <string>using namespace std;int main() {string s;string ret;int count = 0;while(cin >> s)for(auto a : s){if(count == 0){if( a <=

【秋招笔试】9.07米哈游秋招改编题-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述

LeetCode 第414场周赛个人题解

目录 Q1. 将日期转换为二进制表示 原题链接 思路分析 AC代码 Q2. 范围内整数的最大得分 原题链接 思路分析 AC代码 Q3. 到达数组末尾的最大得分 原题链接 思路分析 AC代码 Q4. 吃掉所有兵需要的最多移动次数 原题链接 思路分析 AC代码 Q1. 将日期转换为二进制表示 原题链接 Q1. 将日期转换为二进制表示 思路分析