1 条题解

  • 0
    @ 2025-8-24 22:46:43

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar dbywsc
    **

    搬运于2025-08-24 22:46:43,当前版本为作者最后更新于2025-03-29 11:30:49,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    思路

    用两个指针遍历字符串即可。

    指针 ii 开始时指向第一位,指针 jj 开始时指向第 kk 位,如果 ii 指针指向的字符是 c1c_{1} 就用 cntcnt 记录一下当前 c1c_{1} 出现过的次数,如果 jj 指针指向 c2c_{2} 就让 ansans 加上 cntcnt。这样的话在每次遇到 c2c_{2} 时之前记录的 c1c_{1} 都可以与它组成子串,能够覆盖所有长度不小于 kk 的子串的情况。

    代码

    void solve(void) {
        int k; string s; char c1, c2;
        cin >> k >> s >> c1 >> c2;
        int ans = 0, cnt = 0;
        s = " " + s;
        for(int i = 1, j = k; j <= s.length(); i++, j++) {
            if(s[i] == c1) cnt++;
            if(s[j] == c2) ans += cnt;
        }
        cout << ans << endl;
    }
    
    • 1

    信息

    ID
    8681
    时间
    1000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者