首页 > 其他分享 >蓝桥杯2023年A组-试题D-平方差

蓝桥杯2023年A组-试题D-平方差

时间:2024-04-08 16:58:02浏览次数:22  
标签:子串 ++ 平方差 蓝桥 int flag str 2023 翻转

0. 题目



1. 题解

1.1 基于中心扩展的字符串处理算法

思路

我们可以选定一个中心,然后从中心开始,向外扩展我们的子串,且能存储之前子串的部分性质(这里便于左等于右的情况)
0. 确定中心点
这里我们用外层一个大循环来表示,中心点即为变量i。

  1. 首先分为子串为奇数串和偶数串的情况
    奇数串的话比如像上图示例的我们选的是3作为中心, 但由于要求是连续子串,所以我们默认初始长度为3(长度为1的翻转也没有任何意义,不会改变大小)开始进行翻转。
    这里落实到程序中就是 L=i-1,R=i作为初始值,'L>=0&&R<str.length()'作为结束条件, L--,R++向外扩展。
    偶数串的话其实同理,见程序。

2.其次再考虑到何时可以翻转?
由于我们是由中心点向外扩展, 我们利用贪心的思想,从局部来看,何时能达到翻转后大小变小?

只要区域最左边的值大于最右边的值,结果就会变小。真的只有这样吗?
到了本题的一大难点:我们发现存在 2312 这种,虽然左值等于右值,但是翻转后 2132 > 2312的,就是说左等于右,还要再往里面看一层,就比较麻烦了,可能涉及到递归。

但是这就是我们为何使用从中心扩展的字符串处理,我们发现,只要我们在从中心向外扩展的过程中,加上一个flag标记,标记之前一个是否可以反转,就可以在下一次遇到左等于右的情况时,直接通过标记判断是否可以反转;

你问第一次就是左等于右? 由于为奇数串:121(怎么翻转都不会变), 偶数串:11(怎么翻都不会变) 我们设置flag初值为false(不可翻转)即可!

代码

#include<bits/stdc++.h>
using namespace std;
int ans = 0;
int main(){
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	string str;
	cin >> str;
	for (int i = 0; i < str.length(); i++){
		// 子串个数为偶数
		bool flag = false;
		for (int L = i - 1, R = i; L >= 0 && R < str.length(); L--, R++){
			if(str[L] > str[R]) flag = true; // 左大于右,代表可以交换 
			if(str[L] < str[R]) flag = false; // 右大于左,代表不可以交换 
			if (flag) ans++; // 这里隐含了左等于右的情况,flag情况跟之前保持相同,所以无需写出 
		} 
		
		// 子串个数为奇数 
		flag = false;
		for (int L = i - 1, R = i + 1; L >= 0 && R < str.length(); L--, R++){
			if(str[L] > str[R]) flag = true;
			if(str[L] < str[R]) flag = false;
			if (flag) ans++;
		}
	} 
	cout << ans;
	return 0;
}

标签:子串,++,平方差,蓝桥,int,flag,str,2023,翻转
From: https://www.cnblogs.com/trmbh12/p/18121691

相关文章

  • 【每周例题】蓝桥杯 C++ 对称排序
    对称排序题目对称排序 题目分析1.因为数字是对称交换,所以我们只需要判断前n/2项需不需要交换就好了2.这里我采用了升序排序,你们也可以尝试降序排序3.我们只需要排序好后再遍历一下整个数组,找出不符合排序的就输出NO就好了代码#include<iostream>#include<bits/stdc+......
  • Android Studio 2023.2.1 预览 Markdown 问题
    来源-->https://stackoverflow.com/a/78134409/10288082步骤首先本章默认读者已安装Markdown插件。双击shift,选择action选项卡,搜索设置ChangetheBootJavaRuntimefortheAndroidStudioIDE选择与默认版本差不多的withJCEF版本,会要求重启。比如我目前是1......
  • 2023/11 停课训练
    注:这篇文章里的图片都是截图在本地,所以没有上传的必要。/kk注:这篇文章里的图片都是抄袭的/kk注:这篇文章里的图片都是抄袭的/kk注:这篇文章里的图片都是抄袭的/kkAT_arc165_d[ARC165D]SubstringComparison考虑字典序的性质。我们维护当前的\(a_i,c_i\)表示判断\(a_i......
  • IntelliJ IDEA 2023.2.2 和 JetBrains 激活码,永久激活。
    本方法适用于2023、2022、2021、2020、2019、2018全系列版本。介绍IDEA和JetBrains系列所有软件(IntelliJIDEA、CLion、PhpStorm、GoLand、PyCharm、WebStorm、Rider、DataGrip、RubyMine、AppCode、DataSpell、Gateway、dotCover、dotTrace、dotTrace等等)的激活破解。JetBrains......
  • 第十四届蓝桥杯单片机省赛
    第一部分客观题1.D2.BD3.CA时序逻辑电路是一类具有记忆功能且其输出不仅依赖于当前输入信号,还依赖于电路过去状态的数字电路。常见的时序逻辑电路包括但不限于以下几种类型:1.**触发器**:最基本的存储单元,如RS触发器、JK触发器、D触发器、T触发器等。2.**寄存器**:由多......
  • 蓝桥杯2023年A组-试题C-平方差
    0.题目1.题解1.1数学分析思路主要就是类似剪枝的思想,x必定满足某种条件,我们可以分奇偶情况进行讨论,最后在得出条件后使用暴力枚举.x=(y-z)(y+z)由于奇数±偶数=奇数,偶数±偶数=偶数,奇数±奇数=偶数;可以看出只要y,z的奇偶性质定了,则无论是加减奇......
  • P9231 [蓝桥杯 2023 省 A] 平方差
    因式分解之后发现,满足条件的x要么是奇数,要么是4的倍数#include<iostream>#include<stdio.h>#include<algorithm>#include<string>#include<cmath>#defineR(x)x=read()#defineFor(i,j,n)for(inti=j;i<=n;++i)usingnamespacestd;......
  • 蓝桥杯
    1.题目2.题解2.1贪心+堆思路由于如下图公式所示:要获取的是最大值(最坏情况),故如果increase增量小于零则没有必要讨论(存在刚开始由于b较大使得增量大于零,而k小于0,后面由于x增大导致增量为负值)可利用贪心局部最优(每次选择加人时,均是选择增量最大的一组),实现全......
  • P9232 [蓝桥杯 2023 省 A] 更小的数
    暴力直接暴力枚举区间,并且逐个判断#include<iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<string>#include<cmath>#defineR(x)x=read()#defineFor(i,j,n)for(inti=j;i<=n;++i)using......
  • 蓝桥杯-算法赛第9场强者:贝贝的2.0
    题意:n个节点的有根树,问孩子节点最少是多少,可以满足任意两条长度为k的链有公共节点。思路:一开始想的是以根为中间点,然后构造边。但是发现样例过不了,样例说的很清楚,根节点也作为一个叶子节点去构造,然后把叶子节点作为中间点(这样可以省去一个叶子节点的计数)。最后就是如何处理的问题......