题意:

给定两个由数字组成的序列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 最长公共子序列/组合数的更多相关文章

  1. 2019牛客多校第五场 G subsequence 1 dp+组合数学

    subsequence 1 题意 给出两个数字串s,t,求s的子序列中在数值上大于t串的数量 分析 数字大于另一个数字,要么位数多,要么位数相同,字典序大,位数多可以很方便地用组合数学来解决,所以只剩 ...

  2. 字符串dp——牛客多校第五场G

    比赛的时候脑瘫了没想出来..打多校以来最自闭的一场 显然从s中选择大于m个数组成的数必然比t大,所以只要dp求出从s中选择m个数大于t的方案数 官方题解是反着往前推,想了下反着推的确简单,因为高位的数 ...

  3. 牛客多校第五场G

    subsequence 1 只要处理长度等于t的. 转移方程没想出来QAQ $dp(i,j,0)$代表到$s[i]$为止有多少个前缀序列与$t[0\cdots j]$相同 所以有$dp(i,j,0)= ...

  4. 2019牛客多校第五场H - subsequence 2 拓扑

    H - subsequence 2 题意 要你使用前\(m\)个小写字母构造一个长度为\(n\)的字符串 有\(m*(m-1)/2\)个限制条件: \(c_{1} .c_{2}. len\):表示除去 ...

  5. 牛客多校第五场 H subsequence 2 拓扑排序

    题意: 给你长度最长为1000的字符串,这个字符串中最多有10种字母,每次给你两种字母,输出这两种字母在字符串中的相对位置,问你这个字符串原本是什么样子,如果不存在则输出-1 题解: 把整个字符串看作 ...

  6. 牛客多校第三场 G Removing Stones(分治+线段树)

    牛客多校第三场 G Removing Stones(分治+线段树) 题意: 给你n个数,问你有多少个长度不小于2的连续子序列,使得其中最大元素不大于所有元素和的一半 题解: 分治+线段树 线段树维护最 ...

  7. 牛客多校第四场 G Maximum Mode

    链接:https://www.nowcoder.com/acm/contest/142/G来源:牛客网 The mode of an integer sequence is the value tha ...

  8. 牛客多校第五场 F take

    链接:https://www.nowcoder.com/acm/contest/143/F来源:牛客网 题目描述 Kanade has n boxes , the i-th box has p[i] ...

  9. 牛客多校第五场 J:Plan

    链接:https://www.nowcoder.com/acm/contest/143/J 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...

随机推荐

  1. CentOS7.6安装Go-1.12.9

    安装步骤 Go的官网:https://golang.google.cn 1. 下载压缩包 wget https://dl.google.com/go/go1.12.9.linux-amd64.tar. ...

  2. mfc中的_T

    mfc 中的字符串表示常用_T,意为text,定义为宏定义,可以方便的定义所有字符串为UNICODE(16位,长字符)或者ANSI(8位,短字符). 如果对于所有的字符串定义了_T并且定义了预处理标志 ...

  3. 基于 CI 1.7.x 的 项目使用新版本CI的文件缓存类库

    维护的项目使用的是 codeigniter 1.7.x版本,但是我想使用文件缓存,但是旧版本是没有缓存类库的,并且autoload.php没有drivers这个配置项. 我复制的是 Codeignit ...

  4. python的format函数是什么意思format是什么意思

    format是python2.6新增的一个格式化字符串的方法,相对于老版的%格式方法,它有很多优点. 1.不需要理会数据类型的问题,在%方法中%s只能替代字符串类型 2.单个参数可以多次输出,参数顺序 ...

  5. ps去除元素的三种常用方法

    1.仿制图章工具,alt+鼠标左键进行选取复制区域,然后左键点击需要覆盖的区域. 2.套锁工具--选择区域--右键填充--内容识别.     3.修补工具,选中区域--拖动适配.     附带另一份较 ...

  6. SpringMVC 拦截器原理

    前言 SpringMVC 拦截器也是Aop(面向切面)思想构建,但不是 Spring Aop 动态代理实现的, 主要采用责任链和适配器的设计模式来实现,直接嵌入到 SpringMVC 入口代码里面. ...

  7. 50 ubuntu下pcl编译以及用 VSCode配置pcl / opencv开发环境

    0 引言 最近在VSCode下搞开发,于是将pcl库迁移到这个环境下,用来跑一些依赖pcl的开源的代码以及自己做一些快速开发等. 1 pcl编译 主要参考了这篇博客,链接如下. https://blo ...

  8. Delphi2007中正确调用SetWindowLong隐藏程序任务栏图标

    http://terony.blog.sohu.com/71347192.html‍ Delphi2007中正确调用SetWindowLong隐藏程序任务栏图标 标签: Delphi2007 SetW ...

  9. (转)C++实现RTMP协议发送H.264编码及AAC编码的音视频,摄像头直播

    转:http://www.cnblogs.com/haibindev/archive/2011/12/29/2305712.html C++实现RTMP协议发送H.264编码及AAC编码的音视频 RT ...

  10. Android中滑屏实现----触摸滑屏以及Scroller类详解 .

    转:http://blog.csdn.net/qinjuning/article/details/7419207 知识点一:  关于scrollTo()和scrollBy()以及偏移坐标的设置/取值问 ...