【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的数字序列,选出其中的一个连续子串,然后统计其子串中所有数字之和(注意这里重复出现的数字只被统计 ...
随机推荐
- 品Spring:对@Resource注解的处理方法
@Resource是Java的注解,表示一个资源,它具有双向的含义,一个是从外部获取一个资源,一个是向外部提供一个资源. 这其实就对应于Spring的注入和注册.当它用在字段和方法上时,表示前者.当它 ...
- ELK 学习笔记之 Logstash之filter配置
Logstash之filter: json filter: input{ stdin{ } } filter{ json{ source => "message" } } o ...
- Eclipse的debug按钮介绍(三)
本文链接:https://blog.csdn.net/u011781521/article/details/55000066 http://blog.csdn.net/u010075335/ar ...
- servlet中的forward()和redirect()
从地址栏显示来说 forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器 浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏 ...
- docker相关概念介绍
关键词:docker容器与docker镜像 他们之间的关系是docker容器通过docker镜像来创建 docker镜像就是些像ubuntu15.10,ubuntu14.2一样的系统 docker容器 ...
- 详述Python序列化
一.前言 1. 现实需求 每种编程语言都有各自的数据类型,其中面向对象的编程语言还允许开发者自定义数据类型(如:自定义类),Python也是一样.很多时候我们会有这样的需求: 把内存中的各种数据类型的 ...
- Mysql存储引擎以及锁机制
一.常用命令 1.查看引擎(默认为InnoDB) 查看mysql提供的存储引擎:show engienes 查看mysql当前默认的存储引擎:show variables like '%storage ...
- AVL树、红黑树以及B树介绍
简介 首先,说一下在数据结构中为什么要引入树这种结构,在我们上篇文章中介绍的数组与链表中,可以发现,数组适合查询这种静态操作(O(1)),不合适删除与插入这种动态操作(O(n)),而链表则是适合删除与 ...
- [JZOJ4737] 【NOIP2016提高A组模拟8.25】金色丝线将瞬间一分为二
Description Input Output Sample Input 5 101 12 23 34 45 5 Sample Output 4 Data Constraint Hint 开long ...
- advisor调优工具优化sql(基于sql_id)
advisor调优工具优化sql(基于sql_id) 问题背景:客户反馈数据库迁移后cpu负载激增,帮忙查看原因 解决思路:1> 查看问题系统发现有大量的latch: cache buffers ...