P2679 子串

题意

题目描述

有两个仅包含小写英文字母的字符串\(A\)和\(B\)。

现在要从字符串\(A\)中取出\(k\)个互不重叠的非空子串,然后把这\(k\)个子串按照其在字符串\(A\)中出现的顺序依次连接起来得到一个新的字符串。请问有多少种方案可以使得这个新串与字符串\(B\)相等?

注意:子串取出的位置不同也认为是不同的方案。

输入输出格式

输入格式:

第一行是三个正整数\(n,m,k\),分别表示字符串\(A\)的长度,字符串\(B\)的长度,以及问题描述中所提到的\(k\),每两个整数之间用一个空格隔开。

第二行包含一个长度为\(n\)的字符串,表示字符串\(A\)。

第三行包含一个长度为\(m\)的字符串,表示字符串\(B\)。

输出格式:

一个整数,表示所求方案数。

由于答案可能很大,所以这里要求输出答案对\(1000000007\)取模的结果。

输入输出样例

输入样例:

6 3 1
aabaab
aab

输出样例:

2

输入样例:

6 3 2
aabaab
aab

输出样例:

7

输入样例:

6 3 3
aabaab
aab

输出样例:

7

说明

对于第\(1\)组数据:\(1 \leq n \leq 500,1 \leq m \leq 50,k=1\);

对于第\(2\)组至第\(3\)组数据:\(1 \leq n \leq 500,1 \leq m \leq 50,k=2\);

对于第\(4\)组至第\(5\)组数据:\(1 \leq n \leq 500,1 \leq m \leq 50,k=m\);

对于第\(1\)组至第\(7\)组数据:\(1 \leq n \leq 500,1 \leq m \leq 50,1 \leq k \leq m\);

对于第\(1\)组至第\(9\)组数据:\(1 \leq n \leq 1000,1 \leq m \leq 100,1 \leq k \leq m\);

对于所有\(10\)组数据:\(1 \leq n \leq 1000,1 \leq m \leq 200,1 \leq k \leq m\)。

思路

你可以看一篇优秀的博客。 --alecli

这位神犇叫为了我这道题。

设计状态\(dp[i][j][k][0/1]\),\(i\)表示\(A\)字符串的前\(i\)位,\(j\)表示\(B\)字符串的前\(j\)位,\(k\)表示选取了多少个子串,\(0/1\)表示当前字符有没有选入子串中。

如果该位没有选,那么转移是显然易见的:

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

它表示不论前一位选与不选,我都加一个空格,分开上一子串和下一子串

而如果要选这一位,就要分类讨论这一位上的\(A\)与\(B\)是否相同。

  • 如果不同,那么\(dp[i][j][k][0]=0\);
  • 如果相同,那么\(dp[i][j][k][0]=dp[i-1][j-1][k][1]+dp[i-1][j-1][k-1][1]+dp[i-1][j-1][k-1][0]\),它表示继续下一子串、在上一子串连续的情况下重新开始新一子串、直接作为新子串的开头。

那么答案就是\(dp[n][m][k][0]+dp[n][m][k][1]\)了。

顺便,我的代码怕空间不足,写了滚动数组。如果不写的话,要记得初始化\(dp\)数组的值。

AC代码

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL P=1000000007;
LL n,m,k,dp[2][202][202][2];
string a,b;
int main()
{
cin>>n>>m>>k;
cin>>a>>b;
a=' '+a;
b=' '+b;
dp[0][0][0][0]=dp[1][0][0][0]=1;
for(LL i=1;i<=n;i++)
for(LL j=1;j<=m;j++)
for(LL p=1;p<=k;p++)
{
dp[i&1][j][p][0]=(dp[(i-1)&1][j][p][0]+dp[(i-1)&1][j][p][1])%P;
if(a[i]==b[j]) dp[i&1][j][p][1]=(dp[(i-1)&1][j-1][p][1]+dp[(i-1)&1][j-1][p-1][0]+dp[(i-1)&1][j-1][p-1][1])%P;
else dp[i&1][j][p][1]=0;
}
printf("%lld",(dp[n&1][m][k][1]+dp[n&1][m][k][0])%P);
return 0;
}

Luogu P2679 子串(字符串+dp)的更多相关文章

  1. NOIP2015Day2T2子串(字符串dp)

    又被“if(a=b)”坑了QAQ...写C++还是得开Warning,这么久了pascal还没改过来咋回事啊QWQ 题目大意就不说了OWO 网上的题解都不怎么看得懂啊...好像写得都很乱?还是我太sb ...

  2. 【Luogu】P2679子串(DP)

    题目链接 GuessYCB的题解讲的很棒.就这样. 因为这题我不会,而题解又讲的太全太详细太好了. #include<cstdio> #include<cctype> #inc ...

  3. loj2424 「NOIP2015」子串[字符串DP]

    给定字符串 A,B,要求从 A 中取出互不重叠的 k 个非空子串,按照出现顺序拼起来后等于 B.求方案数.n ≤ 1000,m ≤ 200. 主要是状态的转移.先设计出$f_{i,j,k}$表长度$B ...

  4. 洛谷P2679 子串 [noip2015] dp

    正解:dp 解题报告: 感觉是道dp好题啊,所以就写了个题解 代码实现难度低,思维难度大,像我这种思维僵化傻逼选手只想到了爆搜+组合数学... 其实是道很妙的dp题!好趴也没有多妙主要大概是妙在想到了 ...

  5. [LUOGU] P2679 子串

    一开始用一个f数组转移,发现不太对,状态有重叠部分 f[i][j][k]表示考虑了s的前i位,匹配到t的第j位,用了k个子串,且s的第i位必选 g[i][j][k]表示考虑了s的前i位,匹配到t的第j ...

  6. P2679 子串 DP

    P2679 子串 DP 从字符串A中取出\(k\)段子串,按原顺序拼接,问存在多少个方案使拼接的字符串与字符串B相同 淦,又是这种字符串dp 设状态\(ans[i][j][k]\)表示A串位置\(i\ ...

  7. 洛谷 P2679 子串 解题报告

    P2679 子串 题目描述 有两个仅包含小写英文字母的字符串\(A\)和\(B\). 现在要从字符串\(A\)中取出\(k\)个互不重叠的非空子串,然后把这\(k\)个子串按照其在字符串\(A\)中出 ...

  8. 【BZOJ 2121】 (字符串DP,区间DP)

    2121: 字符串游戏 Description BX正在进行一个字符串游戏,他手上有一个字符串L,以及其他一些字符串的集合S,然后他可以进行以下操作:对于一个在集合S中的字符串p,如果p在L中出现,B ...

  9. AtCoder Regular Contest 081 E - Don't Be a Subsequence(字符串DP)

    引用自:onion_cyc 字符串DP一直不是强项...以后没思路的题就想DP和网络流23333333 f[i]表示从i开始的后缀非子序列的最短长度  pos[i][j]表示从i开始的j字符最早出现位 ...

随机推荐

  1. selenium基础(生成测试报告)

    测试报告 生成HTML测试报告 下载HTMLTestRunner.py包 下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html 下载后,把H ...

  2. 论文阅读笔记---HetConv

    1 写在前边的话 HetConv性能:当使用HetConv取代标准卷积之后,FLOPs大概是之前的1/8到1/3,更重要的是精度几乎不变!!! 论文地址:https://arxiv.org/abs/1 ...

  3. Linux 实用指令(6)--crond任务调度

    目录 crond任务调度 1 原理示意图 2 概述 3 基本语法 3.1 常用选项 4 快速入门 4.1 任务的要求 4.2 步骤如下 4.3 参数细节说明 5 任务调度的几个应用实例 5.1 案例一 ...

  4. AWS云管理平台

  5. swiper 插件里面嵌套可滚动内容

    在移动端使用swiper的整屏滚动,如果slide里面有滚动内容的话,滚动的时候会整个页面一起滚动,如果想里面的滚动区域单独滚动的话,可以在初始化swiper的时候添加上 noSwipingClass ...

  6. webstorm中使用git管理服务器上的代码——入门级

    一.首先要确保电脑已经成功安装好git了.(记住git的安装位置) 二.这里需要给webstorm配置一下:依次点击:file –> Settings –> Version Control ...

  7. 菜鸟nginx源码剖析数据结构篇(六) 哈希表 ngx_hash_t(上)[转]

    菜鸟nginx源码剖析数据结构篇(六) 哈希表 ngx_hash_t(上) Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.c ...

  8. PAT甲级——A1094 The Largest Generation

    A family hierarchy is usually presented by a pedigree tree where all the nodes on the same level bel ...

  9. PAT甲级——A1080 Graduate Admission

    It is said that in 2011, there are about 100 graduate schools ready to proceed over 40,000 applicati ...

  10. String类的endsWith()方法和startsWith()方法

    String 的endsWith() 方法用于测 试字符串是否以指定的后缀结束.如果参数表示的字符序列是此对象表示的字符序列的后缀,则返回 true:否则返回 false.注意,如果参数是空字符串,或 ...