1 条题解
-
0
自动搬运
来自洛谷,原作者为

Nuyoah_awa
事实证明,你没让我失望。搬运于
2025-08-24 22:46:09,当前版本为作者最后更新于2023-04-02 21:45:43,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
题目大意
给定一个字符串,求这个字符串所以子段中
bessie出现的数量。题目分析
思路:dp。
我们观察一个子段的值是子段中
bessie的数量,我们可以考虑把这个值分开来算。我们定义 表示以 结尾的字串中
bessie的数量。我们从第 位倒过来找bessie,第一个bessie的b在第 位。转移方程为:
答案为:
其中 表示 都会把最后那个 包含一次, 表示以 结尾的那些子段所包含的那些
bessie,在末尾拼上 形成以 结尾的那些子段里都被包含。这样子,每个bessie在某个子段中出现几次就会被记几次。然后问题就变成了如何求 ,我们定义 表示到当前字符,最后一个
bessie的前 个字母中b出现的位置,转移方程为:如果当前字符串为bessie的第 个字母,。所以最后一个bessie中的b出现的位置为 ()。这样时间复杂度就是 的。
code
#include <iostream> #include <cstdio> #define int long long using namespace std; const int N = 3e5 + 5; int n, f[7], ans, dp[N]; string s; signed main() { cin >> s; n = s.size(); s = "#" + s; for(int i = 1;i <= n;i++) { if(s[i] == 'b') f[1] = i; if(s[i] == 'e') f[6] = f[5], f[2] = f[1]; if(s[i] == 's') f[4] = f[3], f[3] = f[2]; if(s[i] == 'i') f[5] = f[4]; dp[i] = dp[f[6] - 1] + f[6]; } for(int i = 1;i <= n;i++) ans += dp[i]; printf("%lld", ans); return 0; }
- 1
信息
- ID
- 8560
- 时间
- 4000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者