题目戳这里

一句话题意

给你两个字符串A,B从A中取出K个不重合子串(顺序与在A中顺序相同)组成B,问有多少种方案?

Solution

话说重打还是出各种错误也是醉了

先看题目,因为答案与A串,B串和拆分次数都有关,那么我们把这些都定义进DP方程中:

定义f[i][j][k][0]代表选到A串的前i个字符中选k个子串组成B[1-j],且第i个不选。

那么f[i][j][k][1]就是代表选到A串的前i个字符中选k个子串组成B[1-j],且第i个选。

定义好状态就很好做了:

如果这个不选,那么很明显就等于前一个 选+不选 ,所以:

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

那么如果选呢?首先需要注意因为要选,所以需要A[i]==B[j],否则不匹配。先看转移方程:

f[i][j][k][1]=f[i-1][j-1][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]说明选i并且接在i-1后面组成一整个子串。

f[i-1][j-1][k-1][0] 因为i-1不选,所以需要从k-1转移过来。

f[i-1][j-1][k-1][1] i-1选了,i也可以单独组成子串。

注意事项:

1.因为模数是1e9+7,三个1e9+7就会爆int,所以第二个转移方程需要加两个模一下,再加第三个 (WA了40分)。

2.如果直接定义f数组 空间复杂度是 1000200200*2=8e7 超过了128MB,并且我们的转移方程中 i 的状态只与 i-1 有关,所以需要滚掉第一维。

Coding

#include<bits/stdc++.h>
using namespace std;
const int P = 1e9+7;
const int N = 205;
int t,n,m,f[2][N*5][N][2],K;
char A[N*5],B[N];
int main()
{
cin>>n>>m>>K;
scanf("%s",A+1);
scanf("%s",B+1);
f[0][0][0][0]=1;
for(int i=1;i<=n;i++)
{
t=!t;f[t][0][0][0]=1;
for(int j=1;j<=min(i,m);j++)
for(int k=1;k<=min(j,K);k++)
{
f[t][j][k][0]=(f[!t][j][k][0]+f[!t][j][k][1])%P;
if(A[i]==B[j])
{
f[t][j][k][1]=(f[!t][j-1][k][1]+f[!t][j-1][k-1][0])%P;
f[t][j][k][1]=(f[t][j][k][1]+f[!t][j-1][k-1][1])%P;
}
else f[t][j][k][1]=0;
}
}
cout<<(f[t][m][K][1]+f[t][m][K][0])%P;
return 0;
}

洛谷 2679 [NOIP 2015] 子串的更多相关文章

  1. 洛谷 P2678 [ NOIP 2015 ] 跳石头 —— 二分答案

    题目:https://www.luogu.org/problemnew/show/P2678 二分答案. 代码如下: #include<iostream> #include<cstd ...

  2. 【noip】跟着洛谷刷noip题2

    noip好难呀. 上一个感觉有点长了,重开一个. 36.Vigenère 密码 粘个Openjudge上的代码 #include<cstdio> #include<iostream& ...

  3. 洛谷模拟NOIP考试反思

    洛谷模拟NOIP考试反思 想法 考了这么简单的试qwq然而依然emmmmmm成绩不好 虽然本次难度应该是大于正常PJ难度的但还是很不理想,离预估分数差很多qwq 于是就有了本反思嘤嘤嘤 比赛链接 原比 ...

  4. 洛谷 P4665 [BalticOI 2015]Network

    洛谷 P4665 [BalticOI 2015]Network 你有一棵 $ n $ 个节点的树,你可以在树上加一些边,使这棵树变成一张无重边.自环的图,且删掉任意一条边它仍然联通.求最少要加多少条边 ...

  5. 洛谷 P3951 NOIP 2017 小凯的疑惑

    洛谷 P3951 NOIP 2017 小凯的疑惑 题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付 ...

  6. 【noip】跟着洛谷刷noip题

    传送门 1.铺地毯 d1t1 模拟 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> # ...

  7. 题解——洛谷 P2680 NOIP提高组 2015 运输计划

    树上差分加上二分答案 详细题解待填坑 #include <cstdio> #include <algorithm> #include <cstring> using ...

  8. UOJ #149 [NOIP 2015] 子串

    传送门 Solution DP+滚动数组. DP状态 \(dp[i][j][k]\): \(A\)的第\(i\)个字符和\(B\)的第\(j\)个字符匹配且该字符在第\(k\)个子串中的方案数. 转移 ...

  9. 洛谷 P3960 [ NOIP 2017 ] 列队 —— 线段树

    题目:https://www.luogu.org/problemnew/show/P3960 NOIP 题,不用很复杂的数据结构...但又参考了许多: 要求支持维护删除第 k 个和在末尾插入的数据结构 ...

随机推荐

  1. 如何看一个VC工程具体是什么工程?

    VC6等可以创建MFC, Win32等工程,拿到一个工程,怎么判断是什么工程呢? VC6全文检索看看有没有theApp 如果有一般就是MFC的 (VS?)看看工程设置,入口点函数写的是什么,/subs ...

  2. 标准库Allocator的简易实现(二)

    自己实现Allocator并不难,其实只需要改变allocate和deallocate,来实现自己的内存分配策略.   下面是一个std::allocator的模拟实现 #ifndef ALLOCAT ...

  3. 1、硬件IO口配置;

    对于MTK TP驱动移植一般分为六部分: 1.硬件IO口配置: 2.TP驱动移植. 3.I2C通信: 4.中断触发: 5.数据上报: 6.虚拟按键. 硬件电路: 1.GPIO配置 打开 mediate ...

  4. 重启nginx后丢失nginx.pid的解决方法(转)

    一,nginx的停止操作 停止操作是通过向nginx进程发送信号来实现的.步骤1:查询nginx主进程号 ps -ef | grep nginx 在进程列表里 面找master进程,它的编号就是主进程 ...

  5. 怎样把报表放到网页中显示(Web页面与报表简单集成样例)

    1.问题描写叙述 如今用户开发的系统基本上趋向于BS架构的浏览器/server模式.这些系统可能由不同的语言开发.如HTML.ASP.JSP.PHP等.因此须要将制作好的报表嵌入到这些页面中. Fin ...

  6. 01-2制作U盘启动盘--装机助理工具

    在可以上网的电脑上执行制作启动盘的操作: 打开浏览器输入:http://www.zhuangjizhuli.com/upan.html 1.制作U盘启动盘: 2.下载 装机助理 软件 3.步骤: 第一 ...

  7. 按“开始”-“运行”,或按WIN+R,在[运行]窗口中输入

    command--------CMD命令提示符 ipconfig查看本机IP chkdsk.exe-----Chkdsk磁盘检查   certmgr.msc----证书管理实用程序   calc--- ...

  8. c#创建对象并动态添加属性

    //动态类,可以作为基类被继承 dynamic backObj = new ExpandoObject(); //ExpandoObject 为密封类 backObj.image0 = IMGNAME ...

  9. windows下简单配置squid反向代理服务器

    下载windwosNT版本的squid下载地址: http://squid.acmeconsulting.it/download/squid-2.6.STABLE13-bin.zip 1.把squid ...

  10. org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]

    © 版权声明:本文为博主原创文章,转载请注明出处 1.问题描述 启动hibernate测试案例时报错如下: 2.解决方案: 2.1 第一次解决:MySQL驱动版本太高.使用的hibernate版本为5 ...