牛客多校第五场 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[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 最长公共子序列/组合数相关推荐
- subsequence 1(牛客多校第五场记忆化搜索+组合数学)
链接:https://ac.nowcoder.com/acm/contest/885/G 来源:牛客网 题目描述 You are given two strings s and t composed ...
- 2021牛客多校第五场补题
B-Boxes 链接:https://ac.nowcoder.com/acm/contest/11256/B 来源:牛客网 题目描述 There're nn_{}n boxes in front o ...
- 牛客多校第五场7月31日补题记录
B Boxes 题意:有 nnn 个盒子,每个盒子中装有黑球白球概率均为 12\displaystyle \frac{1}{2}21.打开第 iii 个盒子所需代价为 wiw_iwi.现在有一个机 ...
- 2020年牛客多校第五场C题-easy(纯组合计数不要生成函数的做法)
文章目录 description solution code description 有TTT组测试数据 对于两个长度为KKK的数列{a}\{a\}{a}和{b}\{b\}{b},满足∑i=1Kai= ...
- 牛客多校第五场 A digits 2 签到
题意: 给定一个n,输出一个数,要求这个数所有位之和整除n,并且这个数也整除n,并且位数不许多于1e4 题解: 把这个数n输出n遍. #include<iostream> using na ...
- 牛客多校第六场 G Is Today Friday? 蔡勒公式/排列
题意: 有一堆日期,这些日期都是星期五,但是数字被映射成了字母A~J,现在让你求逆映射,如果存在多种答案,输出字典序最小的那个. 题解: 用蔡勒公式解决关于星期几的问题. 对于映射,可以用笔者刚刚学会 ...
- [manacher][hash]Magic Spells 2022牛客多校第9场 G
题目描述 One day in the magic world, the young wizard RoundDog was learning the compatibility of spells. ...
- 24dian(牛客多校第三场)
24dian(牛客多校第三场) 题意: 给你n张牌,每张牌的大小为1 ~ 13,问这些牌与加减乘除任意组合(可以使用括号),且但所有的有效解在计算过程中都涉及到分数,即非整数,能否组成答案m,如果可以 ...
- 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数
目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...
最新文章
- 2018 JVM 生态报告:79% 的 Java 开发者使用 Java 8
- R语言单因素重复测量方差分析(one-way repeated measures ANOVA)实战
- linux5.5 dvd安装教程,linux 5.5 yum的安装方法(ftp)
- python调用数据库数据创建函数_Pyhton应用程序数据库函数封装
- C语言main()主函数执行完毕后是否会再执行一段代码
- Google 搜索老矣,尚能饭否?
- axios 上传文件 封装_axios 封装【满足常规数据上传及file上传】
- ATX电源的基本描述
- matlab制作图片显示器,自己动手做一个雷达PPI显示器的动态效果图(附Matlab代码)...
- FDMA和TDMA简介
- self :: 和 this- 的用法
- Bootstrap-表格合并单元格
- Java_IO流-IO流
- 表白套路计算机公式,520 超酷表白公式 520表白套路
- 因果推断三种分析框架
- 三分钟带你了解物联网的发展史
- C++基础(四) 文件流 I/O流 文件指针 tellg tellp seekp seekg
- SAP ERP数据表清单
- 讨论:响一声就挂吸费电话频遭投诉 回拨话费被扣数百
- 思科-CCNA,CCNP,CCIE
热门文章
- java label 加图片吗_UILabel里面加图片
- web前端要学哪些东西,前端大牛分享的技能整理
- C语言常见基础错误大全总结
- python成绩转换_Python格式化输出%与format能不能互相转换?
- 写一个c语言的链表记录一下
- 魔术方法 python_python所有的魔术方法
- linux qt创建静态库,QT创建与QT无关的纯C++程序和动态/静态库
- 小米路由器4 bootloader_无线路由器刷机中,Breed详细使用教程,一些注意事项
- Java运算符及录入
- clion配置opencv3.20(cmake+tdm-gcc)