UOJ 149 子串
来源:互联网 发布:suse linux samba 编辑:程序博客网 时间:2024/06/17 13:38
#149. 【NOIP2015】子串
统计有两个仅包含小写英文字母的字符串
现在要从字符串
注意:子串取出的位置不同也认为是不同的方案。
输入格式
第一行是三个正整数
第二行包含一个长度为
第三行包含一个长度为
输出格式
输出共一行,包含一个整数,表示所求方案数。
由于答案可能很大,所以这里要求输出答案对
样例一
input
6 3 1aabaabaab
output
2
样例二
input
6 3 2aabaabaab
output
7
样例三
input
6 3 3aabaabaab
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
限制与约定
时间限制:
空间限制:
设f[i][j][k][0/1]表示A串的前i位取出k个子串匹配了B串的前j位,选或不选第i位。
分两种情况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].
解释一下:若匹配,则选择这一位的情况有如下几种累加方式:(首先B串的匹配个数都要-1)前一位也选并与当前位构成同一个子串(子串个数不变)、前一位选并且不断点为这一位、前一位不选(子串个数都要-1)。
f[i][j][k][0]=f[i-1][j][k][0]+f[i-1][j][k][1]. 解释一下:若不选择这一位,当前方式可以累加的有:(B串的匹配个数不变)前一位选或者前一位不选,子串个数不变(因为这一位不选)
2.若A串第i位与B串第j位不匹配,则f[i][j][k][0]=f[i-1][j][k][0]+f[i-1][j][k][1].解释:若不匹配,该位肯定不能选。所以不选的方案数累加上前一位选或者不选的个数。
#include<cstdio>#include<cstring>#include<string>#include<algorithm>#include<iostream>#include<cmath>using namespace std;const int MAXN=1010;const int MAXM=220;const int Mod=1e9+7;long long f[2][MAXM][MAXM][2];int main(){char a[MAXN],b[MAXM];int n,m,k,cnt=0,last=-1;scanf("%d%d%d",&n,&m,&k);scanf("%s",a+1);scanf("%s",b+1);f[0][0][0][0]=1;for (int i=1;i<=n;i++){cnt++;cnt%=2;last++;last%=2;for (int j=0;j<=m;j++){for (int p=0;p<=k;p++){if (a[i]==b[j]){if (j>0){if (p>0){f[cnt][j][p][1]=f[last][j-1][p][1]+f[last][j-1][p-1][0]+f[last][j-1][p-1][1];f[cnt][j][p][1]%=Mod;}}f[cnt][j][p][0]=f[last][j][p][0]+f[last][j][p][1];f[cnt][j][p][0]%=Mod;}else{f[cnt][j][p][0]=f[last][j][p][0]+f[last][j][p][1];f[cnt][j][p][0]%=Mod;}}}for (int j=0;j<=m;j++){for (int p=0;p<=k;p++){f[last][j][p][0]=0;f[last][j][p][1]=0;}}}cout<<(f[n%2][m][k][1]+f[n%2][m][k][0])%Mod; return 0;}需要开滚动数组不然会MLE,滚动数组每用完一次后都要把当前清零。
再次吐槽超多细节(NOIP还是坑人啊)
- UOJ 149 子串
- 【uoj#149】【NOIP2015】子串 DP
- 【UOJ#149】【NOIP2015】子串【计数DP】
- [UOJ#149][NOIP2015]子串(dp)
- 【DP】UOJ#149 【NOIP2015】子串
- BZOJ 3676 & UOJ 103 [Apio2014]回文串
- [UOJ 118][UOJ Round #8]赴京赶考
- [bzoj 3676][uoj #103]【APIO2014】Palindromes回文串 后缀数组+manachar
- UOJ Round5总结
- 【UOJ Goodbye Jiawu】
- 【UOJ #6】AB题解
- uoj 104 [apio2014 T2]
- Uoj#9感想
- uoj#35: 后缀排序
- Uoj#35. 后缀排序
- 【uoj #35】后缀排序
- 【UOJ 34】多项式乘法
- [UOJ#34]多项式乘法
- JZOJ1297.【USACO题库】4.1.1 Beef McNuggets麦香牛块
- JAVAWEB开发之redis学习(九)——redis主从复制入门及原理
- Android 水平方向跑马灯例子
- list集合与queue集合
- Android animation(一.alpha)
- UOJ 149 子串
- 常胜将军
- emwin学习之路:关于menu小工具的使用
- list.toString()结果
- 递归问题
- ThinkPHP3.2 --- 无法加载数据库驱动: Think\Db\Driver\
- C语言 string及memcpy,memmove函数的模拟实现
- Disruptor框架学习(为什么快)
- UVA 1589 象棋