Codeforces Round #820 (Div. 3) G. Cut Substrings
DP
题意
给一个长度为 的主串 s,一个长度为 的模式串 t,每次可以将当前的 s 中与 t 相同的子串变成一串 "."(如 , 一次操作后 )
求最小的操作次数使 s 中不包含与 t 相同的子串;并且求在最小操作次数下的操作的方案数
思路
- 看数据范围可知大概率是 的 dp
- 类似区间分组优化dp,可令 : 前 i 项消除了 t,最后一个"."在 j,花了 k 次的方案数
- 可优化一维,: 前 i 项消除了 t,且最后一次操作就是对 操作,花了 k 次的方案数
- 类比最长公共子序列的 dp 思路,可再优化一维,: 前 i 项消除了 t,且最后一次操作就是对 操作的最小操作次数,: 消除前 i 项中的 t 时,所花次数最小的方案数
这样更新 即可 (i 可由 j 转移而来)
if (f[i] > f[j] + 1)
{
f[i] = f[j] + 1;
g[i] = g[j];
}
else if (f[i] == f[j] + 1)
add(g[i], g[j]);
参考链接:https://zhuanlan.zhihu.com/p/563809110
代码
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
using namespace std;
#define endl "\n"
typedef long long ll;
typedef pair<int, int> PII;
const int N = 510, mod = 1e9 + 7;
string s, t;
int n, m;
int f[N];
ll g[N];
void add(ll &a, ll b)
{
a += b;
if (a >= mod)
a -= mod;
}
vector<int> a;
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int T;
cin >> T;
while(T--)
{
cin >> s >> t;
n = s.size();
m = t.size();
s = " " + s;
a.clear();
//第0段
a.push_back(0);
//预处理出可以匹配的段
for (int l = 1; l + m - 1 <= n; l++)
{
int r = l + m - 1;
if (equal(l, r))
a.push_back(r);
}
fill(f, f + n + 2, 1e9);
f[0] = 0, g[0] = 1;
for (int i = 1; i < a.size(); i++)
{
for (int j = i - 1; j >= 0; j--)
{
//上一段与当前段不能由交集
if (a[i] - a[j] < m)
continue;
bool fl = true;
//上一段与当前段中间不能有段
for (int k = j + 1; k < i; k++)
{
if (a[k] - a[j] >= m && a[i] - a[k] >= m)
{
fl = false;
break;
}
}
if (!fl)
break;
if (f[i] > f[j] + 1)
{
f[i] = f[j] + 1;
g[i] = g[j];
}
else if (f[i] == f[j] + 1)
add(g[i], g[j]);
}
}
int minn = 1e9;
ll ans = 0;
for (int i = 0; i < a.size(); i++)
if (a.back() - a[i] < m)s
minn = min(minn, f[i]);
for (int i = 0; i < a.size(); i++)
if (a.back() - a[i] < m && f[i] == minn)
add(ans, g[i]);
cout << minn << " " << ans << endl;
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!