假暴力,cf1168B. Good Triple

假暴力,cf1168B. Good Triple

码农世界 2024-05-28 前端 75 次浏览 0个评论

一、题目

1、题目描述

2、输入输出

2.1输入
2.2输出

3、原题链接

Problem - 1168B - Codeforces


二、解题报告

1、思路分析

一眼没思路,打个暴力试试

因为如果 s[l, r] 是一个好字符串,那么s[i, r]一定也是好字符串,其中i < l

那么我们枚举左端点l,找到最近的r,那么l的贡献就是n - r

看起来是O(n^2)的,跑了下过了,而且只跑了46ms,这明明是O(n)复杂度才能跑出来的时间

然后看样例:

这个样例其实是在暗示只要长度大于等于9那么都是好字符串,这个可以二进制枚举2 ^ 9种字符串验证一下发现都是,那么对于长度大于9的字符串,由于它含长度为9的子串,所以它也是好字符串

所以我们的暴力做法其实是O(n)的

2、复杂度

时间复杂度: O(9n)空间复杂度:O(n)

3、代码详解

#include 
using i64 = long long;
int main () {
    std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
    std::string s;
    std::cin >> s;
    i64 res = 0;
    int n = s.size();
    std::vector r(n + 1, n);
    for (int i = n - 1; ~i; i -- ) {
        r[i] = r[i + 1];
        for (int j = 1; i + j * 2 < r[i]; j ++ )
            if (s[i] == s[i + j] && s[i] == s[i + 2 * j])
                r[i] = i + 2 * j;
        res += n - r[i];
    }
    std::cout << res;
    return 0;
}

转载请注明来自码农世界,本文标题:《假暴力,cf1168B. Good Triple》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,75人围观)参与讨论

还没有评论,来说两句吧...

Top