第十四届蓝桥杯:(二分算法)字串简写

这道题我们的做法是开两个vector,分别把a和b字符的下标存进去,然后遍历a字符,我们要求长度必须大于等于k,我们可以画个图,也就是说b的下标减a的下标必须大于等于k-1 也就是b的下标必须大于等于a的下标+k-1 我们用二分找出b数组里面大于等于这个值最小的数的下标,然后用nb减去这个下标就是满足要求的个数了

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;
typedef long long LL;
string s;
LL ret;
vector<LL> a, b;
char ca, cb;
LL k;
int main()
{
	cin >> k >> s >> ca >> cb;

	LL ns = s.size();
	for (int i = 0; i < ns; i++)
	{
		if (s[i] == ca) a.push_back(i);
		else if (s[i] == cb) b.push_back(i);
	}
	LL na = a.size();
	LL nb = b.size();

	for (int i = 0; i < na; i++)
	{
		LL val = a[i] + k - 1;
		LL left = 0, right = nb - 1;
		while (left < right)
		{
			LL mid = (left + right) / 2;
			if (b[mid] >= val) right = mid;
			else left = mid + 1;
		}
		if (b[left] >= val)
			ret +=  nb- left;
	}
	cout << ret << endl;
}
相关推荐
mit6.82417 小时前
几何|阻碍链
算法
有一个好名字17 小时前
力扣-小行星碰撞
算法·leetcode·职场和发展
MM_MS17 小时前
Halcon图像锐化和图像增强、窗口的相关算子
大数据·图像处理·人工智能·opencv·算法·计算机视觉·视觉检测
lamentropetion18 小时前
E - Equal Tree Sums CF1656E
算法
代码游侠18 小时前
应用——智能配电箱监控系统
linux·服务器·数据库·笔记·算法·sqlite
Xの哲學18 小时前
Linux Platform驱动深度剖析: 从设计思想到实战解析
linux·服务器·网络·算法·边缘计算
逑之18 小时前
C语言笔记11:字符函数和字符串函数
c语言·笔记·算法
栈与堆18 小时前
LeetCode-1-两数之和
java·数据结构·后端·python·算法·leetcode·rust
不知名XL18 小时前
day20 回溯算法part02
算法
嵌入式进阶行者18 小时前
【算法】TLV格式解析实例:华为OD机考双机位A卷 - TLV解析 Ⅱ
数据结构·c++·算法