CF17C
定义一个字符串
发现通过复制操作,若
因此我们考虑求出
a,b,c
。
考虑刷表法:
若 a
,则必定是由 a
拓展而来,因此
答案就是
(如果直接这么写会炸空间,但其实
#include <bits/stdc++.h>
using namespace std;
const int MOD = 51123987;
int n, m;
string a;
string a2;
int nxt[155][3];
int dp[155][55][55][55];
int ans = 0;
int main() {
cin >> n >> a;
a = ' ' + a;
for (int i = 1; i <= n; i++)
if (i == 1 || a[i] != a[i - 1])
a2 = a2 + a[i];
m = a2.size();
a2 = ' ' + a2;
memset(nxt, 0, sizeof nxt);
for (int i = m; i >= 1; i--) {
for (int j = 0; j < 3; j++)
nxt[i][j] = nxt[i + 1][j];
if (a2[i] == 'a')
nxt[i][0] = i;
if (a2[i] == 'b')
nxt[i][1] = i;
if (a2[i] == 'c')
nxt[i][2] = i;
}
dp[1][0][0][0] = 1;
for (int i = 1; i <= m; i++)
for (int x = 0; x <= (n + 2) / 3; x++)
for (int y = 0; y <= (n + 2) / 3; y++)
for (int z = 0; z <= (n + 2) / 3; z++) {
if (x + y + z == n && abs(x - y) <= 1 && abs(x - z) <= 1 && abs(z - y) <= 1) {
ans += dp[i][x][y][z];
ans %= MOD;
}
if (nxt[i][0] != 0)
dp[nxt[i][0]][x + 1][y][z] = (dp[nxt[i][0]][x + 1][y][z] + dp[i][x][y][z]) % MOD;
if (nxt[i][1] != 0)
dp[nxt[i][1]][x][y + 1][z] = (dp[nxt[i][1]][x][y + 1][z] + dp[i][x][y][z]) % MOD;
if (nxt[i][2] != 0)
dp[nxt[i][2]][x][y][z + 1] = (dp[nxt[i][2]][x][y][z + 1] + dp[i][x][y][z]) % MOD;
}
cout << ans << endl;
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战