题意:

给定两个由数字组成的序列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[3005],str2[3005];
LL Cmn[3005][3005];
LL dp[3005][3005];
int qpow(int base,int n){int ans=1;while(n){if(n%2){ans=1LL*ans*base%MOD;}base=1LL*base*base%MOD;n>>=1;}return ans;
}
//void makerev(){
//    for(int i=1;i<=3000;i++){
//        rev[i]=qpow(i,MOD-2);
//    }
//    return ;
//}
void MakeCmn(){memset(Cmn,0,sizeof Cmn);Cmn[0][0]=1; for(int n=1;n<=3000;n++){Cmn[n][0]=1;for(int m=1;m<=n;m++){Cmn[n][m]=Cmn[n-1][m-1]+Cmn[n-1][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=0;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=0;for(int i=l2+1;i<=l1;i++){ans+=Cmn[l1][i];ans%=MOD;for(int j=0;j<l1;j++){if(str1[j]=='0'){ans-=Cmn[l1-1-j][i-1];ans+=MOD;ans%=MOD;}}}
//        printf(">:%d\n",ans);dp[0][0] = 1;for (int i = 1; i <= l1; i++) {dp[i][0] = 1;for (int j = 1; j <= min(l2, i); j++) {dp[i][j] = dp[i-1][j];if (str1[i-1] == str2[j-1]) {dp[i][j] = (0LL+dp[i][j] + dp[i-1][j-1]) % MOD;} else if (str1[i-1] > str2[j-1]) {ans = (0LL+ans + dp[i-1][j-1]*Cmn[l1-i][l2-j]) % MOD;}}}printf("%d\n",ans);}return 0;
}

这道题带来的教训:能用dp,不要用dfs,尤其是当两者思维难度差不太多的时候。

转载于:https://www.cnblogs.com/isakovsky/p/11290594.html

牛客多校第五场 G subsequence 1 最长公共子序列/组合数相关推荐

  1. subsequence 1(牛客多校第五场记忆化搜索+组合数学)

    链接:https://ac.nowcoder.com/acm/contest/885/G 来源:牛客网 题目描述 You are given two strings s and t composed ...

  2. 2021牛客多校第五场补题

    B-Boxes 链接:https://ac.nowcoder.com/acm/contest/11256/B 来源:牛客网 题目描述 There're nn_{}n​ boxes in front o ...

  3. 牛客多校第五场7月31日补题记录

    B Boxes 题意:有 nnn 个盒子,每个盒子中装有黑球白球概率均为 12\displaystyle \frac{1}{2}21​.打开第 iii 个盒子所需代价为 wiw_iwi​.现在有一个机 ...

  4. 2020年牛客多校第五场C题-easy(纯组合计数不要生成函数的做法)

    文章目录 description solution code description 有TTT组测试数据 对于两个长度为KKK的数列{a}\{a\}{a}和{b}\{b\}{b},满足∑i=1Kai= ...

  5. 牛客多校第五场 A digits 2 签到

    题意: 给定一个n,输出一个数,要求这个数所有位之和整除n,并且这个数也整除n,并且位数不许多于1e4 题解: 把这个数n输出n遍. #include<iostream> using na ...

  6. 牛客多校第六场 G Is Today Friday? 蔡勒公式/排列

    题意: 有一堆日期,这些日期都是星期五,但是数字被映射成了字母A~J,现在让你求逆映射,如果存在多种答案,输出字典序最小的那个. 题解: 用蔡勒公式解决关于星期几的问题. 对于映射,可以用笔者刚刚学会 ...

  7. [manacher][hash]Magic Spells 2022牛客多校第9场 G

    题目描述 One day in the magic world, the young wizard RoundDog was learning the compatibility of spells. ...

  8. 24dian(牛客多校第三场)

    24dian(牛客多校第三场) 题意: 给你n张牌,每张牌的大小为1 ~ 13,问这些牌与加减乘除任意组合(可以使用括号),且但所有的有效解在计算过程中都涉及到分数,即非整数,能否组成答案m,如果可以 ...

  9. 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数

    目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...

最新文章

  1. 2018 JVM 生态报告:79% 的 Java 开发者使用 Java 8
  2. R语言单因素重复测量方差分析(one-way repeated measures ANOVA)实战
  3. linux5.5 dvd安装教程,linux 5.5 yum的安装方法(ftp)
  4. python调用数据库数据创建函数_Pyhton应用程序数据库函数封装
  5. C语言main()主函数执行完毕后是否会再执行一段代码
  6. Google 搜索老矣,尚能饭否?
  7. axios 上传文件 封装_axios 封装【满足常规数据上传及file上传】
  8. ATX电源的基本描述
  9. matlab制作图片显示器,自己动手做一个雷达PPI显示器的动态效果图(附Matlab代码)...
  10. FDMA和TDMA简介
  11. self :: 和 this- 的用法
  12. Bootstrap-表格合并单元格
  13. Java_IO流-IO流
  14. 表白套路计算机公式,520 超酷表白公式 520表白套路
  15. 因果推断三种分析框架
  16. 三分钟带你了解物联网的发展史
  17. C++基础(四) 文件流 I/O流 文件指针 tellg tellp seekp seekg
  18. SAP ERP数据表清单
  19. 讨论:响一声就挂吸费电话频遭投诉 回拨话费被扣数百
  20. 思科-CCNA,CCNP,CCIE

热门文章

  1. java label 加图片吗_UILabel里面加图片
  2. web前端要学哪些东西,前端大牛分享的技能整理
  3. C语言常见基础错误大全总结
  4. python成绩转换_Python格式化输出%与format能不能互相转换?
  5. 写一个c语言的链表记录一下
  6. 魔术方法 python_python所有的魔术方法
  7. linux qt创建静态库,QT创建与QT无关的纯C++程序和动态/静态库
  8. 小米路由器4 bootloader_无线路由器刷机中,Breed详细使用教程,一些注意事项
  9. Java运算符及录入
  10. clion配置opencv3.20(cmake+tdm-gcc)