第十四届蓝桥杯 子串简写 | 树状数组解法

Problem: 第十四届蓝桥杯 子串简写

程序猿圈子里正在流行一种很新的简写方法:

对于一个字符串,只保留首尾字符,将首尾字符之间的所有字符用这部分的长度代替。

例如 internationalization 简写成 i18n,Kubernetes 简写成 K8s,Lanqiao 简写成 L5o 等。

在本题中,我们规定长度大于等于 K 的字符串都可以采用这种简写方法(长度小于 K 的字符串不配使用这种简写)。

给定一个字符串 S和两个字符 c1 和 c2,请你计算 S 有多少个以 c1 开头 c2 结尾的子串可以采用这种简写?

输入格式

第一行包含一个整数 K。

第二行包含一个字符串 S 和两个字符 c1 和 c2。

输出格式

一个整数代表答案。

数据范围

对于 20% 的数据,2≤|S|≤10000。
对于 100% 的数据,2≤|S|≤5*10^5。S只包含小写字母。c1 和 c2 都是小写字母。
|S| 代表字符串 S的长度。

输入样例:

4 abababdb a b​

输出样例:

6

文章目录

解题方法

  1. 遍历字符串,找到等于输入的起始符s[i],则从当前字符往后数k个开始(s[i+k-1]至s[s.length()-1]),都可以做为结束符,即需要给i+k-1至s.length()-1这个区间加1。(这个区间包含了目标结束符和其他字符,最终只需找目标结束符即可)
  2. 再遍历字符串,找到每个目标结束符,再去累加上他们的大小。

复杂度

时间复杂度:

添加时间复杂度, 示例: O ( n l o g n ) O(nlogn) O(nlogn)

空间复杂度:

添加空间复杂度, 示例: O ( n ) O(n) O(n)

Code

// 子串简写
const int N = 500005;
long long tr[N];
int lowbit(int x) {
    return x & (-x);
}
void add(int x, long long v) {
    for (; x < N; x += lowbit(x)) tr[x] += v;
}
long long query(int x) {
    long long res = 0;
    for (; x > 0; x -= lowbit(x)) res += tr[x];
    return res;
}

int main()
{
    long long res = 0;
    string s;
    int k;
    char start, end;
    cin >> k >> s >> start >> end;
    for (int i = 1; i <= s.length(); ++i) {
        if (s[i-1] == start)add(i + k - 1, 1);// 即以当前字符作起始符,然后保证这个子串长度>=k,所以结束符的有效范围从i + k - 1开始
    }
    for (int i = 1; i <= s.length(); ++i) {
        if (s[i-1] == end)res += query(i);
    }
    cout << res;
    return 0;
}

相关推荐

  1. 杯 子简写 | 树状数组解法

    2024-04-23 02:48:01       32 阅读
  2. 三国游戏(杯)

    2024-04-23 02:48:01       48 阅读
  3. 杯 三国游戏

    2024-04-23 02:48:01       42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-23 02:48:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-23 02:48:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-23 02:48:01       87 阅读
  4. Python语言-面向对象

    2024-04-23 02:48:01       96 阅读

热门阅读

  1. AI时代,智能体成下一个爆点

    2024-04-23 02:48:01       145 阅读
  2. 网络通信 mac表 tcp连接

    2024-04-23 02:48:01       188 阅读
  3. Elasticsearch克隆索引

    2024-04-23 02:48:01       42 阅读
  4. 什么是掩码补丁位置?

    2024-04-23 02:48:01       56 阅读
  5. 图标字体库——Font Awesome

    2024-04-23 02:48:01       39 阅读
  6. MySQL用户和权限管理深入指南

    2024-04-23 02:48:01       30 阅读
  7. 机器学习——逻辑回归

    2024-04-23 02:48:01       36 阅读
  8. 如何使用React.js从头开始构建TODO应用

    2024-04-23 02:48:01       32 阅读
  9. hbase基础(三)

    2024-04-23 02:48:01       36 阅读