ABC456复盘

第一次打atcoder上的比赛。
第一次晚上打比赛。
第一次赛场上写出DP(突然想到解法)。

战绩:AC:4。
状态:中等偏下。

A

一个if边界也很明显。

B

看到概率,哇,好高深!
以为要用什么数学方法算概率,but,这是B怎么可能这么复杂?
枚举所有情况,观察每次枚举最多6次,三重循环只有216次。
复杂度只有\(O(6^3)\)看得懂就行。
千万不要被吓人的题面,逆天的结果吓到,不要简单的问题复杂化

C

问题陈述

给定一个由 a、b、c 组成的字符串 \(S\)
找出 \(S\) 中没有两个相邻字符相同的非空字串个数,模为 \(998244353\)
如果从不同位置取两个子串,即使它们作为子串是完全相同的,也会被认为是不同的。
在这里什么是子串? 例如,ab 是 abc 的子串,但 ac 不是 abc 的子串。
人话:能从大字符串直接拉出来一段连续的字符组成的字符串.(区间)

也是被巨大的模数吓到了,发现不能把每一种情况具体的找出来,慌了神,又以为是数学。
可以用双指针实现,不过我没有怕写错,但是逻辑都是一样的。

代码很短,看代码即可:

#include <bits/stdc++.h>

using namespace std;

#define int long long
constexpr int P = 998244353;

signed main() {
    string s;
    cin >> s;
    int n = s.size();
    s = '!' + s;

    int cnt = 1;
    int l = 1; // 当前这一段合法字串的长度。
    for (int i = 2; i <= n; i++) {
        if (s[i] != s[i - 1]) { // 如果算上这个字符也合法。
            l++;
        } else {
            l = 1;
        }
        cnt = (cnt + l) % P; 
        /*
        为什么是加l?
        l其实是可以代表一段区间的,
        若左端点为x, 右端点就是x + l - 1(我把它设为y)
        那么也就是加上了[x, y], [x + 1, y], [x + 2, y]...[y, y]这么多选项。
        为什么不是l - 1?
        因为有一种是对于自己,+ 1 - 1抵消了。
        */
    }

    cout << cnt;
    return 0;
}

为什么只要一个循环?他不会遗漏吗?
如果是两个循环枚举所有情况,每次只会记录一种情况,逻辑可行,但是超时
不会遗漏,不难发现每次\(O(1)\)的枚举, 已经代替我们做了一个区间的枚举(而且都是合法区间)。

D

题面非常相似,只是所谓子串的性质改了,他不必是一个连续的区间,是一个字符序列(下标不用连续)了。
做法非常不类似,要用DP(我的弱项)。

写出这题,需要一个重大发现:假如有子序列组成的字符串a, 和字符b ,只要a的末尾字符和b不相同,表面上就可组成一个新的子序列 (实际上增加的的数量原理类似上文为什么是加l),那么分别记录以字符a, b, c结尾的字串的长度,用dp数组存下。
那么对于一个字符,他能拼接的子串自然是那两个末位与它不相等的字串,然后对于以这个字符结尾的子串所对应的dp就可更新了,新增的数值自然是与另两个子串拼接时新产生的子串数量

代码如果,不理解思考一小会就可以了。

#include <bits/stdc++.h>

using namespace std;

#define int long long
constexpr int N = 3e5 + 2;
constexpr int P = 998244353;

int dp[N];

signed main() {
    string s;
    cin >> s;
    int n = s.size();
    s = '!' + s;

    int cnt = 0;
    for (int i = 1; i <= n; i++) {
        int c = s[i] - 'a';
        int ndp = (cnt - dp[c] + P + 1) % P; // +1:自己也是新的字串,也以自己结尾
        cnt = (cnt + ndp) % P;
        dp[c] = (dp[c] + ndp) % P;
    }

    cout << cnt;
    return 0;
}

The end.

posted @ 2026-05-02 22:51  PCMSFV  阅读(13)  评论(0)    收藏  举报