NOIP2015 子串
#149. 【NOIP2015】子串
有两个仅包含小写英文字母的字符串 AA 和 BB。
现在要从字符串 AA 中取出 kk 个互不重叠的非空子串,然后把这 kk 个子串按照其在字符串 AA 中出现的顺序依次连接起来得到一个新的字符串。请问有多少种方案可以使得这个新串与字符串 BB 相等?
注意:子串取出的位置不同也认为是不同的方案。
输入格式
第一行是三个正整数 n,m,kn,m,k,分别表示字符串 AA 的长度,字符串 BB 的长度,以及问题描述中所提到的 kk,每两个整数之间用一个空格隔开。
第二行包含一个长度为 nn 的字符串,表示字符串 AA。
第三行包含一个长度为 mm 的字符串,表示字符串 BB。
输出格式
输出共一行,包含一个整数,表示所求方案数。
由于答案可能很大,所以这里要求输出答案对 10000000071000000007 取模的结果。
样例一
input
6 3 1
aabaab
aab
output
2
样例二
input
6 3 2
aabaab
aab
output
7
样例三
input
6 3 3
aabaab
aab
output
7
explanation
所有合法方案如下:(加下划线的部分表示取出的子串)
样例一:aab aab / aab aab
样例二:a ab aab / a aba ab / a a ba ab / aab a ab / aa b aab / aa baa b / aab aa b
样例三:a a b aab / a a baa b / a ab a a b / a aba a b / a a b a a b / a a ba a b / aab a a b
限制与约定
| 测试点编号 | nn的规模 | mm的规模 | kk的规模 |
|---|---|---|---|
| 1 | n≤500n≤500 | m≤50m≤50 | k=1k=1 |
| 2 | k=2k=2 | ||
| 3 | |||
| 4 | k=mk=m | ||
| 5 | |||
| 6 | k≤mk≤m | ||
| 7 | |||
| 8 | n≤1000n≤1000 | m≤100m≤100 | |
| 9 | |||
| 10 | m≤200m≤200 |
时间限制:1s1s
空间限制:128MB128MB
题解:
//参考blog.sengxian.com
※先定义:s[i][j][k]为字符串A第i-1位对应字符串B第j-1位所达到的种类数,f[i][j][k]为A的i-1位和B的j-1位正好配对时所达到的种类数。
※转移方程1:那么很容易得到:s[i][j][k]=s[i-1][j][k]+f[i][j][k],即当前阶段的种类数=上一阶段未使用i-1位的种类数+使用i-1位的种类数。
※转移方程2:那么现在考虑怎样转移f[i][j][k],要分两种情况。
1.当A(i-1) ≠ B(j-i)时,很明显f[i][j][k]=0
2.当A(i-1) = B(j-i)时,就又回到选与不选的问题上来了。所以,又分两种情况,一是直接和i-1与j-1配对的情况并未同一个子串,二是不并,新成立一个子串
可知:
0 (A(i-1) ≠ B(j-i))
f[i][j][k]=
f[i-1][j-1][k]+s[i-1][j-1][k-1] (A(i-1) = B(j-i))
| #104939 | #149. 【NOIP2015】子串 | ksq2013 | 100 | 112ms | 4100kb | C++ | 565b | 2016-10-28 17:16:59 |
程序如下:
#include<cstdio>
#include<cstring>
#include<iostream>
#define MXN 1100
#define md 1000000007
#define fx(x,a,b) for(x=a;x<=b;x++)
#define fy(x,a,b) for(x=a;x>=b;x--)
using namespace std;
int N,M,K,i,j,k,s[MXN][MXN],f[MXN][MXN];
char s1[MXN],s2[MXN];
int main()
{
scanf("%d%d%d",&N,&M,&K);
getchar();
gets(s1);
gets(s2);
s[][]=;
fx(i,,N)fy(j,M,)
if(s1[i-]==s2[j-])
fy(k,min(K,j),)
f[j][k]=(s[j-][k-]+f[j-][k])%md,s[j][k]=(s[j][k]+f[j][k])%md;
else fill(f[j],f[j]+min(K,j)+,);
printf("%d\n",s[M][K]);
return ;
}
NOIP2015 子串的更多相关文章
- NOIP2015子串[序列DP]
题目背景 无 题目描述 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个互不重 叠的非空子串,然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一 个 ...
- LOJ2424 NOIP2015 子串 【DP】*
LOJ2424 NOIP2015 子串 LINK 题目大意是给你两个序列,在a序列中选出k段不重叠的子串组成b序列,问方案数 首先我们不考虑相邻的两段,把所有相邻段当成一段进行计算 然后设dpi,j, ...
- [NOIP2015] 子串(dp)
题目描述 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一 个新的字符串,请问 ...
- [vijos1982][NOIP2015]子串
Description 有两个仅包含小写英文字母的字符串和.现在要从字符串中取出个互不重叠的非空子串,然后把这个子串按照其在字符串中出现的顺序依次连接起来得到一个新的字符串,请问有多少种方案可以使得这 ...
- 【uoj149】 NOIP2015—子串
http://uoj.ac/problem/149 (题目链接) 题意 给出两个字符串A.B,问从A中取出k个互不重叠的子串按顺序组成B的方案数. Solution 一看这种题目就是字符串dp,字符串 ...
- [NOIP2015] 子串substring 题解
[题目描述] 有两个仅包含小写英文字母的字符串A和B.现在要从字符串A中取出k个互不重叠的非空子串,然后把这k个子串按照其在字符串A中出现的顺序依次连接起来得到一个新的字符串,请问有多少种方案可以使得 ...
- NOIP2015 子串 (DP+优化)
子串 (substring.cpp/c/pas) [问题描述] 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个 互不重 叠 的非空子串,然后把这 k 个子串按照其在字 ...
- [DP][NOIP2015]子串
子串 题目描述 有两个仅包含小写英文字母的字符串 A 和 B. 现在要从字符串 A 中取出 k 个 互不重叠 的非空子串, 然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一个新的 ...
- [NOIP2015]子串 题解
题目描述 有两个仅包含小写英文字母的字符串A和B. 现在要从字符串A中取出k个互不重叠的非空子串,然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一个新的字符串,请问有多少种方案可 ...
随机推荐
- atitit.数据验证--db数据库数据验证约束
atitit.数据验证--db数据库数据验证约束 1. 为了加强账户数据金额的安全性,需要增加验证字段..1 2. 创建帐户1 3. 更改账户2 4. ---code3 5. --fini4 1. 为 ...
- Android Contextual Menus之一:floating context menu
Android Contextual Menus之一:floating context menu 上下文菜单 上下文相关的菜单(contextual menu)用来提供影响UI中特定item或者con ...
- ios开发人员北京,上海,深圳的工资待遇是多少?
ios开发人员北京,上海,深圳的工资待遇是多少? [1]首先看看平均工资 从图中来看,北京平均工资15570 居首,不愧是首都啊. 你过了平均线了吗?是不是感觉被平均了,如果感觉工资 ...
- 如何为Swift进行宏定义
这阵子一直在自学Swift, 因为之前iOS的开发一直用Objective-C, 所以习惯了C语言那种宏定义方式, Swift作为一款更加安全的语言, 放弃了C语言中的宏定义, 有效的防止预编译时代码 ...
- UI入门指引
1. iOS学习路线: C语言:数据类型.流程控制.函数.指针.字符串.结构体.枚举.预处理: OC:面向对象.内存管理.分类.协议.Block.KVC/KVO.Foundation框架: iOS基础 ...
- c中的数据类型、常量、变量
一. 数据 1. 什么是数据 生活中时时刻刻都在跟数据打交道,比如体重数据.血压数据.股价数据等.在我们使用计算机的过程中,会接触到各种各样的数据,有文档数据.图片数据.视频数据,还有聊QQ时产生的文 ...
- iOS 学习 - 14.本地联系人
苹果在iOS9的SDK中废除了AddressBookUI.framework的一些功能(是不是这个库都废除了,有待验证),具体和保存联系人相关的几个系统界面如下:联系人选择:AddressBookUI ...
- 我的android学习经历7
android签名后报错的问题 Duplicate id @+id/imageView, already defined earlier in this layout,android生成报错 这个是项 ...
- net2.0对于递归变量的处理方式不同引发的递归问题
同样的代码,用NET2.0执行产生的效果与其它框架使用的不同,导致报错. 认真查找原因后发现该程序的编写人员隐式的使用了一个公共变量,使之在递归过程中不断的被改写,使得1次递归后就破坏了原来的循环体, ...
- VBA 操作数字
第8章 操作数字 加.减.乘.除.平方与指数(^2 或者^n).平方根Sqr.正弦Sin.余弦Cos.正切Tan.反正切Atn.绝对值Abs 转换为整型数.长整型数.双精度型数和值 Cint当双精度型 ...