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

这道题我们的做法是开两个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;
}
相关推荐
少许极端13 分钟前
算法奇妙屋(十)-队列+宽搜(BFS)
java·数据结构·算法·bfs·宽度优先·队列
想唱rap2 小时前
Linux开发工具(4)
linux·运维·服务器·开发语言·算法
前端炒粉2 小时前
21.搜索二维矩阵 II
前端·javascript·算法·矩阵
星释2 小时前
Rust 练习册 :Rail Fence Cipher与栅栏密码
开发语言·算法·rust
东方隐侠安全团队-千里2 小时前
第3节 RSA算法开启公钥加密时代
网络·人工智能·算法
7澄13 小时前
深入解析 LeetCode 1:两数之和
算法·leetcode·职场和发展·arraylist
Moonbit3 小时前
MGPIC 初赛提交倒计时 4 天!
后端·算法·编程语言
Miraitowa_cheems4 小时前
LeetCode算法日记 - Day 98: 分割回文串 II
数据结构·算法·leetcode·深度优先·动态规划
立志成为大牛的小牛4 小时前
数据结构——三十九、顺序查找(王道408)
数据结构·学习·程序人生·考研·算法