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

这道题我们的做法是开两个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;
}
相关推荐
_Itachi__25 分钟前
LeetCode 热题100 21. 合并两个有序链表
算法·leetcode·链表
萌の鱼2 小时前
leetcode 240. 搜索二维矩阵 II
数据结构·c++·算法·leetcode·矩阵
@心都2 小时前
机器学习数学基础:37.统计学基础知识1
人工智能·算法·机器学习
奈葵2 小时前
动态规划/贪心算法
算法·动态规划
轩源源2 小时前
数据结构——哈希表的实现
开发语言·数据结构·c++·算法·哈希算法·散列表·哈希桶
wanjiazhongqi2 小时前
常见的排序算法 【复习笔记】
笔记·算法·排序
火车叨位去19492 小时前
拼电商客户管理系统
算法
lili-felicity3 小时前
深入理解指针与回调函数:从基础到实践
c语言·数据结构·算法
倔强的石头1063 小时前
【C++经典例题】字符串特定规则反转问题的解法
算法·leetcode·职场和发展
waves浪游3 小时前
vector详解
c语言·开发语言·数据结构·c++·算法