NOIP2015 提高组 子串

感觉是最长公共子序列模型的变式。

容易想到记 \(f[i][j][k]\) 表示 \(A\) 走到了第 \(i\) 位,\(B\) 匹配上了 \(1 \sim j\),目前分成了 \(k\) 段的方案数。

如果强制第 \(i\) 位必须匹配上的话,需要枚举位置 \(p\),满足 \(A[p] = B[j - 1]\)。这样的复杂度是 \(O(n^2m^2)\),无法通过本题。

我们采用类似最长公共子序列的方式,不必强制 \(i\) 必须匹配上,也可以直接从上一个状态继承过来。

具体来说,记 \(f[i][j][k][1/0]\) 表示 \(A\) 走到了第 \(i\) 位,\(B\) 匹配上了 \(1 \sim j\),目前分成了 \(k\) 段,\(a[i]\) 匹配 / 不匹配的方案数。

如果 \(a[i]\) 匹配上了,分段的话,上一位匹没匹配上无所谓,不分段的话,上一位也必须要匹配上,即:

\[f[i][j][k][1] = f[i - 1][j - 1][k - 1][0] + f[i - 1][j - 1][k - 1][1] + f[i - 1][j - 1][k ][1]
\]

如果 \(a[i]\) 没匹配上,上一位匹没匹配上无所谓,即:

\[f[i][j][k][0] = f[i - 1][j][k][0] + f[i - 1][j][k][1]
\]

答案就是 \(f[n][m][k][0] + f[n][m][k][1]\)。注意有上一位的继承,所以不用枚举谁匹配 \(b[m]\) 了。

时间复杂度 \(O(nm^2)\),而且跑不满,非常快。

算一下空间,\(128MB\) 存不下,把 \(i\) 维给滚掉就可以了。

(今天才发现原来 Luogu 不能 cin >> (a + 1),于是用了 scanf

#include<bits/stdc++.h>
#define F(i,l,r) for(int i(l);i<=(r);++i)
#define G(i,r,l) for(int i(r);i>=(l);--i)
using namespace std;
using ll = long long;
const int mod = 1e9 + 7;
int f[2][205][205][2];
int n, m, s;
char a[1005], b[205];
signed main(){
scanf("%d %d %d %s %s", &n, &m, &s, a + 1, b + 1);
F(i, 1, n){
f[(i - 1) & 1][0][0][0] = 1;
F(j, 1, m) F(k, 1, s) f[i & 1][j][k][0] = f[i & 1][j][k][1] = 0;
F(j, 1, min(i, m)){
F(k, 1, min(j, s)){
f[i & 1][j][k][0] = (f[(i - 1) & 1][j][k][0] + f[(i - 1) & 1][j][k][1]) % mod;
if(a[i] == b[j])
f[i & 1][j][k][1] = ((f[(i - 1) & 1][j - 1][k][1]+ f[(i - 1) & 1][j - 1][k - 1][0]) % mod + f[(i - 1) & 1][j - 1][k - 1][1]) % mod;
}
}
}
printf("%d", (f[n & 1][m][s][0] + f[n & 1][m][s][1]) % mod);
return fflush(0), 0;
}

本题的关键在于打开思路,不必强制当前位必须匹配,一个小小的定义修改,足以影响复杂度。

NOIP2015 提高组 子串的更多相关文章

  1. [NOIP2015提高组]子串

    题目:洛谷P2679.Vijos P1982.codevs4560.UOJ#149. 题目大意:有长度为n的A串和长度为m的B串.现在要从A串中取出k个互不重叠的子串,使它们按顺序相连后得到B串.问有 ...

  2. 刷题总结——子串(NOIP2015提高组)

    题目: 题目背景 NOIP2015 提高组 Day2 T2 题目描述 有两个仅包含小写英文字母的字符串 A 和 B .现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其在 ...

  3. 【题解】NOIP2015提高组 复赛

    [题解]NOIP2015提高组 复赛 传送门: 神奇的幻方 \([P2615]\) 信息传递 \([P2661]\) 斗地主 \([P2668]\) 跳石头 \([P2678]\) 子串 \([P26 ...

  4. [NOIP2015] 提高组 洛谷P2615 神奇的幻方

    题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. ...

  5. 洛谷-神奇的幻方-NOIP2015提高组复赛

    题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,--,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. ...

  6. 洛谷 P2678 & [NOIP2015提高组] 跳石头

    题目链接 https://www.luogu.org/problemnew/show/P2678 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布 ...

  7. 【数据结构】运输计划 NOIP2015提高组D2T3

    [数据结构]运输计划 NOIP2015提高组D2T3 >>>>题目 [题目描述] 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航 ...

  8. 【二分查找】 跳石头NOIP2015提高组 D2T1

    [二分查找]跳石头NOIP2015提高组 D2T1 >>>>题目 [题目描述] 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石 ...

  9. noip2015 提高组 day1t1 神奇的幻方

    题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,--,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. ...

  10. NOIP2015 提高组] 运输计划

    码农题啊兄弟们. 随便考虑二分一下,然后发现要取一条满足性质的边. 被所有大于\(mid\)的路径都覆盖,取了之后能把他们都弄到小于\(mid\) 那就树上差分再处理一下. 写了\(180h\),老年 ...

随机推荐

  1. 2023 CCPC 女生题解

    gym B. 终焉之茧 \(\star\) 显然两个维度分别做 单谷函数,起始点 \(A\) 是一个端点.一个 naive 的想法是三分目标点 \(B\),但交互次数会超.二分关于 \(B\) 对称点 ...

  2. 手把手教你ubuntu下移植MJPG-streamer

    一.嵌入式视频图像开源库 在嵌入式系统中,常用的视频图像处理开源系统有:luvcview.cheese.motion.mjpg-streamer或者ffmpeg,其中: • luvcview: 基于V ...

  3. chezmoi 使用

    chezmoi(发音 /ʃeɪ mwa/ (shay-moi)):在多台不同的机器上安全地管理你的 dotfiles. 安装 macOS: brew install chezmoi Ubuntu: s ...

  4. 【图文安装教程】在docker中安装ES

    在docker中安装ES怎么安装?本文就教大家怎么安装 1.部署单点es 1.1.创建网络 因为我们还需要部署kibana容器,因此需要让es和kibana容器互联.这里先创建一个网络: docker ...

  5. c++ push_back()和emplace_back()区别

    c++ push_back()和emplace_back()区别 References C++中push_back和emplace_back的区别 push_back v.s. emplace_bac ...

  6. Vue.js 异步组件传参

    本文主要展示一下如何给异步组件进行参数传递: 通过 h 函数就可以啦 versions: vue@3.2.13 子组件 Async.vue <template> <div> & ...

  7. 欢迎加入d3shop,一个DDD实战项目

    背景 整个<老肖的领域驱动设计之路>系列关于认知的核心部分已经基本闭环,但纸上得来终觉浅,还是需要通过实际操作来体会和验证我们的观点,接下来,我将通过一个实战项目来带着大家一起体验从需求到 ...

  8. element plus 2.3.14(完成 指南 部分)

    https://element-plus.org/zh-CN/guide/design.html 设计 控制反馈: 通过界面样式和交互动效让用户可以清晰的感知自己的操作: 页面反馈: 操作后,通过页面 ...

  9. SpringBoot——整合SSM(主要整合MyBatis)

    基于SpringBoot整合SSM SpringBoot整合Spring(不存在) SpringBoot整合SpringMVC(不存在) SpringBoot整合MyBatis(主要) Spring整 ...

  10. Redis系列补充:聊聊布隆过滤器(go语言实践篇)

    ★ Redis24篇集合 1 介绍 布隆过滤器(Bloom Filter)是 Redis 4.0 版本之后提供的新功能,我们一般将它当做插件加载到 Redis Service服务器中,给 Redis ...