题意:

给定两个由数字组成的序列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. 继续搞我的linux

    小程序研发已经告一段落,还是继续我的Linux研究.上次因为捣鼓那个fastab,结果吧虚拟机搞崩溃了.好吧,这次老子来装正式机,从机房拉来了一台破烂货,联想的老式服务器,开工吧. 用UltraISO ...

  2. Vue-cli开发笔记三----------引入外部插件

    (一)绝对路径直接引入: (1)主入口页面index.html中头部script标签引入: <script type="text/javascript" src=" ...

  3. Python自学:第四章 切片

    # -*- coding: GBK -*- players = ['charles', 'martina', 'michael', 'florence', 'eli'] print(players[0 ...

  4. php上传(一)

    php上传基础知识总结 1.文件上传 1>文件上传的原理:将客户端上的文件通过浏览器上传到服务器上, 在将服务器上的文件移动到指定目录. 2>客户端的配置 表单页面,浏览框 method= ...

  5. checkbox与文字对齐

    checkbox和后面的文字如果不加样式,会导致checkbox和文字对齐,解决办法是对checkbox和文字同时添加如下样式: vertical-align:middle;

  6. Go 程序开发的注意事项

    Go 程序开发的注意事项    1) Go 源文件以 "go" 为扩展名.    2) Go 应用程序的执行入口是 main()函数. 这个是和其它编程语言(比如 java/c)  ...

  7. Feign连接超时 Read timed out

    在远程调用的过程中由于连接超时,导致无法成功请求数据,下面是报错 项目中用的是spring-cloud-starter-openfeign 2.2.0版本 找到对应的文档,开始查阅资料 文档首页就找到 ...

  8. NX二次开发-UFUN修剪体UF_MODL_trim_body

    1 NX11+VS2013 2 3 4 #include <uf.h> 5 #include <uf_modl.h> 6 7 8 UF_initialize(); 9 10 / ...

  9. NX二次开发-UF_MODL_intersect_objects获取两个对象的交点

    NX9+VS2012 #include <uf.h> #include <uf_curve.h> #include <uf_modl.h> #include < ...

  10. 秦曾昌人工智能课程---5、KNN和朴素贝叶斯

    秦曾昌人工智能课程---5.KNN和朴素贝叶斯 一.总结 一句话总结: 拟合和概率:构建机器学习模型,一般有拟合和概率两种方式 轻学无用:一定要保证学有所用,要深入学习,比如之前做的安卓,一定要学通, ...