【XSY2344】K-th String
Description
Alice有 n(n≤26) 张牌,牌上分别标有前 n 个英文小写字母。例如,如果 n=3 ,则Alice有3张牌,分别标有"a", "b", "c" 。Alice可以通过排列这些卡牌来构造字符串 t 。考虑字符串 t 的所有子串(共 n(n+1)2 个),按照字典序从小到大排名第 k 的子串为 s 。现在,给你正整数 n,k 和字符串 s ,问有多少种可能的字符串 t 。将答案对 109+7 取模。
例如: 当 n=3,t="cab" 时,排序后的子串为"a", "ab", "b", "ca", "cab", "cab",排名第3的子串为"b"。当 n=3,k=3,s="b" 时 ,则 t 可能为"cab"或"bac" ,故答案为2种。
Input
第一行两个整数 \(n,k(1≤n≤26,1≤k≤n(n+1)/2)\) 。
第二行一个字符串 s ,s 中仅包含前 n 个字母,且 s 中的字母两两不同。
Output
输出一行表示答案。将答案对 109+7 取模。
Sample Input
3 3
b
Sample Output
2
HINT
数据范围与约定
对于30%的数据, \(1≤n≤8\)
对于所有数据, \(1≤n≤26\)
想象一下DP
我们先枚举s串
\(dp[i][j][k][l]\)表示前\(i\)个字母中,有\(j\)个比\(s[1]\)小,他们对答案的贡献为\(k\)(添加这个节点后会有多少个新的小于\(s[1]\)的串),\(l=0或1\),表示现在所取的子串中,有没有s这个串的方案数。
三种情况状态转移:
1.不取\(i\)这个点: dp[i+1][j][kk][l]=dp[i+1][j][kk][l]+dp[i][j][kk][l]
2.取\(i\)这个点:
一个点的贡献就是包含这个点在内,剩余子串的长度。
dp[i+1][j+1][kk+n-i][l]=dp[i+1][j+1][kk+n-i][l]+dp[i][j][kk][l]
3.直接取整个s串(前提:之前没取过s):
直接取s串的贡献就是对s串中的每一个点都求贡献
if(i+len<=n&&!l)
{
dp[i+len][j][kk+(n-i)*sum1-sum][1]=(dp[i+len][j][kk+(n-i)*sum1-sum][1]+dp[i][j][kk][l])%mod;
}
最后统计答案:
因为在s串之前的字母的每一种排列都符合要求,所以答案要乘上排列的情况数。
s串之后的字母同理。
代码:
#include<bits/stdc++.h>
#define mod 1000000007
using namespace std;
int n,k,dp[27][27][3050][2],sum,sum1;
char ch[27];
int main()
{
scanf("%d%d%s",&n,&k,ch+1);
int len=strlen(ch+1);
k-=len;
if(k<0)
{
puts("0");
return 0;
}
int num=ch[1]-'a'+1;
for(int i=1;i<=len;i++)
{
if(ch[i]<=ch[1])
{
num--;
if(ch[i]!=ch[1])
{
sum=sum+i-1;
sum1++;//在s串之内的小于s[1]的字母的个数
}
}
}
dp[0][0][0][0]=1;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
for(int kk=0;kk<=n*(n+1)/2;kk++)
{
for(int l=0;l<=1;l++)
{
dp[i+1][j][kk][l]=(dp[i+1][j][kk][l]+dp[i][j][kk][l])%mod;//不取
dp[i+1][j+1][kk+n-i][l]=(dp[i+1][j+1][kk+n-i][l]+dp[i][j][kk][l])%mod;//取
if(i+len<=n&&!l)
{
dp[i+len][j][kk+(n-i)*sum1-sum][1]=(dp[i+len][j][kk+(n-i)*sum1-sum][1]+dp[i][j][kk][l])%mod;//整个s串
}
}
}
}
}
long long ans=dp[n][num][k][1];//答案的一种
for(int i=1;i<=num;i++)//乘上头和尾的排列数
{
ans=(ans*i)%mod;
}
for(int i=1;i<=n-num-len;i++)
{
ans=(ans*i)%mod;
}
printf("%lld\n",ans);
return 0;
}
【XSY2344】K-th String的更多相关文章
- 【CF1132F】Clear the String(动态规划)
[CF1132F]Clear the String(动态规划) 题面 CF 题解 考虑区间\(dp\). 增量考虑,每次考虑最后一个字符和谁一起删去,然后直接转移就行了. #include<io ...
- 【HDU5421】Victor and String(回文树)
[HDU5421]Victor and String(回文树) 题面 Vjudge 大意: 你需要支持以下操作: 动态在前端插入一个字符 动态在后端插入一个字符 回答当前本质不同的回文串个数 回答当前 ...
- 【CF954I】Yet Another String Matching Problem(FFT)
[CF954I]Yet Another String Matching Problem(FFT) 题面 给定两个字符串\(S,T\) 求\(S\)所有长度为\(|T|\)的子串与\(T\)的距离 两个 ...
- 【LeetCode】880. Decoded String at Index 解题报告(Python)
[LeetCode]880. Decoded String at Index 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博 ...
- 【BZOJ3110】K大数查询(整体二分)
[BZOJ3110]K大数查询(整体二分) 题面 BZOJ 题解 看了很久整体二分 一直不知道哪里写错了 ... 又把树状数组当成线段树区间加法来用了.. 整体二分还是要想清楚在干什么: 我们考虑第\ ...
- 【CF1133E】K Balanced Teams(动态规划,单调队列)
[CF1133E]K Balanced Teams(动态规划,单调队列) 题面 CF 让你把一堆数选一些出来分成不超过\(K\)组,每一组里面的最大值和最小值之差不超过\(5\),求最多有多少个人元素 ...
- 【Hihocoder1413】Rikka with String(后缀自动机)
[Hihocoder1413]Rikka with String(后缀自动机) 题面 Hihocoder 给定一个小写字母串,回答分别把每个位置上的字符替换为'#'后的本质不同的子串数. 题解 首先横 ...
- 【CF886D】Restoration of string 乱搞
[CF886D]Restoration of string 题意:对于给定的一个母串,定义一个字符串是出现频率最多的,当且仅当它在母串中出现的次数最多(可以有多个出现次数最多的,出现的位置可以重叠). ...
- 【BZOJ4520】K远点对(KD-Tree)
[BZOJ4520]K远点对(KD-Tree) 题面 BZOJ 洛谷 题解 考虑暴力. 维护一个大小为\(K\)的小根堆,然后每次把两个点之间的距离插进去,然后弹出堆顶 这样子可以用\(KD-Tree ...
- 【BZOJ4504】K个串 可持久化线段树+堆
[BZOJ4504]K个串 Description 兔子们在玩k个串的游戏.首先,它们拿出了一个长度为n的数字序列,选出其中的一个连续子串,然后统计其子串中所有数字之和(注意这里重复出现的数字只被统计 ...
随机推荐
- sort,uniq,wc,tr
sort (选项)(参数) sort是用来排序数据的. 以下面这个文本为例 [root@bogon ~]# cat a 123 4567 88 abc aaa AAA jk 777 777 ...
- Linux 下复制整个文件夹的命令
在 Linux 下复制整个文件夹,包括它的子文件夹及其隐藏文件的方法是: cp -r /etc/skel /home/user 或者 mkdir /home/<new_user> cp - ...
- 在Linux环境下采用压缩包方式安装JDK 13
本文地址:https://www.cnblogs.com/oberon-zjt0806/p/11663731.html 可以,转载,出处,格式,懂?? 什么是JDK?? 好吧如果你不知道这个问题的话我 ...
- Redis 介绍学习
1.Redis 简介 Redis 是一个支持数据结构更多的键值对数据库.它的值不仅可以是字符串等基本数据 类型,也可以是类对象,更可以是 Set.List.计数器等高级的数据结构. Memcached ...
- python requests-toolbelt 生成上传multipart/form-data格式数据
需求背景 想使用requests做一个自动上传的功能,发现这里问题挺多的,就记录一下. 如上图上传功能,一般分为input标签,非input标签.我这里也不管什么标签,直接抓包看数据流. Conten ...
- 一个神秘现象引发对beego框架的思考
小强最近在项目中遇到了一个很奇怪的问题:在整改日志规范时,为了避免影响现有的代码结构以及改动尽可能小的前提下,在调用记日志的SDK处将某一个字段值首字母改为大写,代码示例如下: fmt.Println ...
- Microsoft Word 2019 mac破解版下载
Microsoft Word 2019 Mac版是大名鼎鼎的Office办公软件组件之一,能帮助你进行文字排版,可方便的进行创作项目.作业.信件.博客.剧本.笔记.评论文章或简历. Microsoft ...
- ThinkPHP架构(一)-TP原理及路径问题及后台实现实例
一直用CSDN的博客,由于域名当时注册写的不合适,现在想来博客园写博客,以后要坚持写啦,记录自己的技术学习路程 本人两个月前,刚完成基于PHP的研会门户网站,虽然实现了基本功能,但感觉技术有些单薄,便 ...
- ubuntu16.04 gcc升级到7.3
下载gcc- wget https://mirrors.ustc.edu.cn/gnu/gcc/gcc-7.3.0/gcc-7.3.0.tar.gz 运行 download_prerequisites ...
- 【OUC2019写作】学术论文写作第九小组第一次博客作业
个人简介 潘旻琦:我是潘旻琦:我的爱好是游泳:羊肉泡馍是海大食堂中我最喜欢的一道菜(清真食堂):一句想说的话是:“追随本心,坚持不懈”. 郭念帆:我是郭念帆:我的爱好是足球:海大食堂中最喜欢的一道菜偏 ...