牛客多校第五场 G subsequence 1 最长公共子序列/组合数
题意:
给定两个由数字组成的序列s,t,找出s所有数值大于t的子序列。注意不是字典序大。
题解:
首先特判s比t短或一样长的情况。
当s比t长时,直接用组合数计算s不以0开头的,长度大于t的所有子序列数量。
然后再去看s的和t一样长的子序列。
就是在找s和t的公共子序列,并且一旦某一位s比t大了,就不找了,直接用组合数求此种情况下后面的组合方式,一旦某一位s比t小了,也不找了,直接返回0.
组合数要预处理。
#include<iostream>
#include<cstring>
#define MOD 998244353
#define LL long long
using namespace std;
char str1[],str2[];
LL Cmn[][];
LL dp[][];
int qpow(int base,int n){
int ans=;
while(n){
if(n%){
ans=1LL*ans*base%MOD;
}
base=1LL*base*base%MOD;
n>>=;
}
return ans;
}
//void makerev(){
// for(int i=1;i<=3000;i++){
// rev[i]=qpow(i,MOD-2);
// }
// return ;
//}
void MakeCmn(){
memset(Cmn,,sizeof Cmn);
Cmn[][]=;
for(int n=;n<=;n++){
Cmn[n][]=;
for(int m=;m<=n;m++){
Cmn[n][m]=Cmn[n-][m-]+Cmn[n-][m];
Cmn[n][m]%=MOD;
}
}
// for(int i=1;i<=3000;i++){
// for(int j=1;j<=i;j++){
// printf("从%d里取%d个的方案是%d\n",i,j,Cmn[i][j]);
// }
// }
}
int l1,l2;
int main(){
// makerev();
MakeCmn();
int t;
scanf("%d",&t);
while(t--){
scanf("%d %d",&l1,&l2);
scanf("%s %s",str1,str2);
if(l1<l2){
printf("0\n");
continue;
}else if(l1==l2){
for(int i=;i<l1;i++){
if(str1[i]>str2[i])goto B;
if(str1[i]<str2[i]){
printf("0\n");
goto A;
}
}
printf("0\n");
continue;
B:;printf("1\n");
A:;continue;
}
//第一个串比第二个长的情况
LL ans=;
for(int i=l2+;i<=l1;i++){
ans+=Cmn[l1][i];
ans%=MOD;
for(int j=;j<l1;j++){
if(str1[j]==''){
ans-=Cmn[l1--j][i-];
ans+=MOD;
ans%=MOD;
}
}
}
// printf(">:%d\n",ans);
dp[][] = ;
for (int i = ; i <= l1; i++) {
dp[i][] = ;
for (int j = ; j <= min(l2, i); j++) {
dp[i][j] = dp[i-][j];
if (str1[i-] == str2[j-]) {
dp[i][j] = (0LL+dp[i][j] + dp[i-][j-]) % MOD;
} else if (str1[i-] > str2[j-]) {
ans = (0LL+ans + dp[i-][j-]*Cmn[l1-i][l2-j]) % MOD;
}
}
} printf("%d\n",ans);
}
return ;
}
这道题带来的教训:能用dp,不要用dfs,尤其是当两者思维难度差不太多的时候。
牛客多校第五场 G subsequence 1 最长公共子序列/组合数的更多相关文章
- 2019牛客多校第五场 G subsequence 1 dp+组合数学
subsequence 1 题意 给出两个数字串s,t,求s的子序列中在数值上大于t串的数量 分析 数字大于另一个数字,要么位数多,要么位数相同,字典序大,位数多可以很方便地用组合数学来解决,所以只剩 ...
- 字符串dp——牛客多校第五场G
比赛的时候脑瘫了没想出来..打多校以来最自闭的一场 显然从s中选择大于m个数组成的数必然比t大,所以只要dp求出从s中选择m个数大于t的方案数 官方题解是反着往前推,想了下反着推的确简单,因为高位的数 ...
- 牛客多校第五场G
subsequence 1 只要处理长度等于t的. 转移方程没想出来QAQ $dp(i,j,0)$代表到$s[i]$为止有多少个前缀序列与$t[0\cdots j]$相同 所以有$dp(i,j,0)= ...
- 2019牛客多校第五场H - subsequence 2 拓扑
H - subsequence 2 题意 要你使用前\(m\)个小写字母构造一个长度为\(n\)的字符串 有\(m*(m-1)/2\)个限制条件: \(c_{1} .c_{2}. len\):表示除去 ...
- 牛客多校第五场 H subsequence 2 拓扑排序
题意: 给你长度最长为1000的字符串,这个字符串中最多有10种字母,每次给你两种字母,输出这两种字母在字符串中的相对位置,问你这个字符串原本是什么样子,如果不存在则输出-1 题解: 把整个字符串看作 ...
- 牛客多校第三场 G Removing Stones(分治+线段树)
牛客多校第三场 G Removing Stones(分治+线段树) 题意: 给你n个数,问你有多少个长度不小于2的连续子序列,使得其中最大元素不大于所有元素和的一半 题解: 分治+线段树 线段树维护最 ...
- 牛客多校第四场 G Maximum Mode
链接:https://www.nowcoder.com/acm/contest/142/G来源:牛客网 The mode of an integer sequence is the value tha ...
- 牛客多校第五场 F take
链接:https://www.nowcoder.com/acm/contest/143/F来源:牛客网 题目描述 Kanade has n boxes , the i-th box has p[i] ...
- 牛客多校第五场 J:Plan
链接:https://www.nowcoder.com/acm/contest/143/J 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...
随机推荐
- true - (成功的)什么都不做
总览 (SYNOPSIS) true [忽略命令行参数] true OPTION 描述 (DESCRIPTION) 程序 结束 时, 产生 表示 成功 的 状态码. 下列的 选项 没有 简写 形式. ...
- SQL索引操作
1. 创建索引 create index 索引名 on 表名(列名); 2. 删除索引 drop index 索引名; 3. 创建组合索引 create index 索引名 on 表名(列名1,,列名 ...
- php7 安装时需求的依赖包
php70 php70-bcmath php70-cli php70-common php70-devel php70-fpm php70-gd php70-json php70-mbstring p ...
- js怎样判断一个数是质数
1.首先了解什么是质数(即:只能被1和它本身整除的数叫质数)主要代码 /** *判断该数是否为素数 */ function isPrimeNum(num){ ; i < num/+; i++) ...
- Executor ExecutorService Executors
Executor public interface Executor { void execute(Runnable command); } ExecutorService ExecutorServi ...
- paper 16 : 计算机视觉领域博客资源
这是收录的图像视觉领域的博客资源的第一部分,包含:中国内地.香港.台湾 这些名人大家一般都熟悉,本文仅收录了包含较多资料的个人博客,并且有不少更新,还有些名人由于分享的paper.code或者数据集不 ...
- NX二次开发-UFUN获取球的参数UF_MODL_ask_sphere_parms
NX11+VS2013 #include <uf.h> #include <uf_modl.h> #include <uf_ui.h> UF_initialize( ...
- <Java编程思想>读书笔记(1)-对象导论、一切都是对象
1.面向对象编程:OOP (Object-oriented Programming) 2.Alan Kay 总结的面向对象语言5个基本特性: 1) 万物皆为对象 2) 程序是对象的集合,他们通过发送消 ...
- idea中选中了一个变量名,会高亮显示位于别的地方的这个变量名,那么怎么修改其他地方的高亮颜色
- LeetCode刷题笔记-BFS-二叉树层次遍历
题目描述: 给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如:给定二叉树 [3,9,20,null,null,15,7], 3 / \ ...