题意:

给定两个由数字组成的序列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. this.$router.push

    跳转详情页this.$router.push({ path: `/activityDetails/${id}` })

  2. Vue Router高级

    路由组件传参 通过props解耦 const User = { props: ['id'], template: '<div>User {{ id }}</div>' } co ...

  3. 6367. 【NOIP2019模拟2019.9.25】工厂

    题目 题目大意 给你一堆区间,将这些区间分成特定的几个集合,使得每个集合中的所有区间的并不为空. 求最大的每组区间的交的长度之和. 思考历程 一开始就认为这绝对是\(DP\)-- 试着找一些性质,结果 ...

  4. Linux grep 后通过 | 在次grep

    grep 'info' info.log|grep 'info2' 先筛选出 包含‘info’的信息,再次筛选出包含'info2'的信息

  5. zjoi 2008 树的统计——树链剖分

    比较基础的一道树链剖分的题 大概还是得说说思路 树链剖分是将树剖成很多条链,比较常见的剖法是按儿子的size来剖分,剖分完后对于这课树的询问用线段树维护——比如求路径和的话——随着他们各自的链向上走, ...

  6. 树形dp换根,求切断任意边形成的两个子树的直径——hdu6686

    换根dp就是先任取一点为根,预处理出一些信息,然后在第二次dfs过程中进行状态的转移处理 本题难点在于任意割断一条边,求出剩下两棵子树的直径: 设割断的边为(u,v),设down[v]为以v为根的子树 ...

  7. 虚树(树形dp套路)模板——bzoj2286

    虚树的核心就是把关键点和关键点的lca重新生成一棵树,然后在这棵树上进行dp https://www.cnblogs.com/zwfymqz/p/9175152.html  写的很好的博客 建立虚树的 ...

  8. 笨办法学Python记录--习题18 变量 函数 help的由来;if语句,循环和列表,冒泡排序,判断输入字符串的方法

    20140414 记录 习题17 - 33 函数可以做3件事: 1. 给代码片段命名,,就跟“变量”给字符串和数字命名一样. 2. 可以接受参数,就跟你的脚本接受argv 一样. 3. 通过使用#1 ...

  9. class10_Frame 框架

    最终运行效果图(程序见序号2):   #!/usr/bin/env python # -*- coding:utf-8 -*- # ---------------------------------- ...

  10. GIT学习记录3(分支管理)

    学习参考地址:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 本编随笔只是自己对 ...