[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

相关文章

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

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

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. 将日期转换为二进制表示 思路分析

牛客小白月赛100部分题解

比赛地址:牛客小白月赛100_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ A.ACM中的A题 #include<bits/stdc++.h>using namespace std;#define ll long long#define ull = unsigned long longvoid solve() {ll a,b,c;cin>>a>>b>