第十四届蓝桥杯省赛C++B组G题【子串简写】题解(AC)






题目大意

给定字符串 s s s,字符 a , b a, b a,b,问字符串 s s s 中有多少个 a a a 开头 b b b 结尾的子串。

解题思路

20pts

使用二重循环枚举左端点和右端点,判断是否为 a a a 开头 b b b 结尾的字符串,是则答案加一。

100pts

数据范围较大,我们需要将时间复杂度控制在 O ( n log ⁡ n ) O(n\log n) O(nlogn) 以内。

法一

我们需要找到所有 a a a 开头 b b b 结尾的字符串,那么我们可以对于每个字符 b b b,去看 b b b 的左侧有几个 a a a,那么这些 a ... b a\dots b a...b 就是合法的字符串。统计某个位置的左侧有几个字符 a a a,我们可以使用前缀和算法进行维护。

法二

我们可以去遍历整个字符串,对于每个 a a a 字符的右侧有几个字符 b b b,那么这些 a ... b a \dots b a...b 都是合法的字符串。统计某个位置之后字符 b b b 的个数,可以使用后缀和算法进行维护。

cpp 复制代码
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long LL;

const int N = 5e5 + 10;

int n, m;
string str;
char a, b;
int s[N];

int main()
{
    cin >> m >> str >> a >> b;
    n = str.size();
    str = ' ' + str;
    
    for (int i = n; i; -- i )
        s[i] = s[i + 1] + (str[i] == b);
    
    LL res = 0;
    for (int i = 1; i + m - 1 <= n; ++ i )
        if (str[i] == a)
            res += s[i + m - 1];
    
    cout << res << endl;
    
    return 0;
}

【在线测评】

相关推荐
渡过晚枫2 分钟前
[第十六届蓝桥杯/java]2.2025
java·职场和发展·蓝桥杯
酉鬼女又兒19 分钟前
HTML零基础快速入门篇(可用于备赛蓝桥杯Web应用开发) 牛客手把手戴刷FED1~8:基本标签,基本标签,媒体标签详解
前端·职场和发展·蓝桥杯·html·web
REDcker19 分钟前
Linux C++ 内存泄漏排查分析手册
java·linux·c++
临溟夜空的繁星24 分钟前
C++ STL-- vector
开发语言·c++
一方热衷.1 小时前
YOLO26-OBB ONNXruntime部署 python/C++
开发语言·c++·python
安姌1 小时前
京东社招——Java后端开发面试复盘
面试·职场和发展
Qt程序员1 小时前
基于 C++ 实现自定义字符串 string 类
linux·c++·容器·指针·内存管理·运算符重载
Ivanqhz1 小时前
活跃范围重写(Live Range Rewriting)
开发语言·c++·后端·算法·rust
做就对了66661 小时前
管理者的格局,是团队的天花板
职场和发展·职场·管理·团队管理
luckycoding2 小时前
3005. 最大频率元素计数
算法·leetcode·职场和发展