P9753 [CSP-S 2023] 消消乐 题解
考前天天祈祷不考串串和数数结果靠这个翻盘好好好。
为什么都说 D 比 B 简单。
Solution
按照一般的计数 dp 的状态设计,我们不妨设
最后答案是
考虑合法的子串有哪几种形式,不妨设
那么合法的字串只可能为一下四种形式:
其他所有的都可以规约到这四种。
设
那我们的转移便是
加 1 是因为要把自己算上,前面的
对于
code
#include <bits/stdc++.h>
#define rep(i, j, k) for(int i = (j); i <= (k); i ++)
#define per(i, j, k) for(int i = (j); i >= (k); i --)
#define fi first
#define se second
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int N = 2e6 + 5, INF = 0x3f3f3f3f;
const LL mod = 1e9 + 7;
int n;
string s;
LL f[N];
int lst[N];
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
cin >> n >> s;
s = " " + s;
rep(i, 1, n) {
lst[0] = -1;
if(s[i] == s[i - 1]) lst[i] = i - 1;
else {
lst[i] = -1;
int j = i - 1;
while(lst[j] != -1) {
j = lst[j] - 1;
if(s[i] == s[j]) {
lst[i] = j;
break;
}
}
}
}
rep(i, 1, n) if(lst[i] != -1) f[i] = f[lst[i] - 1] + 1;
LL res = 0;
rep(i, 1, n) res += f[i];
cout << res << '\n';
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!