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的更多相关文章

  1. 【CF1132F】Clear the String(动态规划)

    [CF1132F]Clear the String(动态规划) 题面 CF 题解 考虑区间\(dp\). 增量考虑,每次考虑最后一个字符和谁一起删去,然后直接转移就行了. #include<io ...

  2. 【HDU5421】Victor and String(回文树)

    [HDU5421]Victor and String(回文树) 题面 Vjudge 大意: 你需要支持以下操作: 动态在前端插入一个字符 动态在后端插入一个字符 回答当前本质不同的回文串个数 回答当前 ...

  3. 【CF954I】Yet Another String Matching Problem(FFT)

    [CF954I]Yet Another String Matching Problem(FFT) 题面 给定两个字符串\(S,T\) 求\(S\)所有长度为\(|T|\)的子串与\(T\)的距离 两个 ...

  4. 【LeetCode】880. Decoded String at Index 解题报告(Python)

    [LeetCode]880. Decoded String at Index 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博 ...

  5. 【BZOJ3110】K大数查询(整体二分)

    [BZOJ3110]K大数查询(整体二分) 题面 BZOJ 题解 看了很久整体二分 一直不知道哪里写错了 ... 又把树状数组当成线段树区间加法来用了.. 整体二分还是要想清楚在干什么: 我们考虑第\ ...

  6. 【CF1133E】K Balanced Teams(动态规划,单调队列)

    [CF1133E]K Balanced Teams(动态规划,单调队列) 题面 CF 让你把一堆数选一些出来分成不超过\(K\)组,每一组里面的最大值和最小值之差不超过\(5\),求最多有多少个人元素 ...

  7. 【Hihocoder1413】Rikka with String(后缀自动机)

    [Hihocoder1413]Rikka with String(后缀自动机) 题面 Hihocoder 给定一个小写字母串,回答分别把每个位置上的字符替换为'#'后的本质不同的子串数. 题解 首先横 ...

  8. 【CF886D】Restoration of string 乱搞

    [CF886D]Restoration of string 题意:对于给定的一个母串,定义一个字符串是出现频率最多的,当且仅当它在母串中出现的次数最多(可以有多个出现次数最多的,出现的位置可以重叠). ...

  9. 【BZOJ4520】K远点对(KD-Tree)

    [BZOJ4520]K远点对(KD-Tree) 题面 BZOJ 洛谷 题解 考虑暴力. 维护一个大小为\(K\)的小根堆,然后每次把两个点之间的距离插进去,然后弹出堆顶 这样子可以用\(KD-Tree ...

  10. 【BZOJ4504】K个串 可持久化线段树+堆

    [BZOJ4504]K个串 Description 兔子们在玩k个串的游戏.首先,它们拿出了一个长度为n的数字序列,选出其中的一个连续子串,然后统计其子串中所有数字之和(注意这里重复出现的数字只被统计 ...

随机推荐

  1. 五 mysql之多表查询

    目录 一 介绍 二 多表连接查询 1.交叉连接:不适用任何匹配条件.生成笛卡尔积 2.内连接:只连接匹配的行 3 .外链接之左连接:优先显示左表全部记录 4 .外链接之右连接:优先显示右表全部记录 5 ...

  2. hover和position共用出现的问题

    hover  鼠标移入的样式 position  定位属性 包含 relative  相对定位   absolute  绝对定位为     fixed 固定定位 hover作用范围 可以实现自己样式的 ...

  3. [ASP.NET Core 3框架揭秘] 跨平台开发体验: Docker

    对于一个 .NET Core开发人员,你可能没有使用过Docker,但是你不可能没有听说过Docker.Docker是Github上最受欢迎的开源项目之一,它号称要成为所有云应用的基石,并把互联网升级 ...

  4. Linux入门(历史与现状)

    Linux 入门之 历史与现状   Linux是一个计算机的操作系统,与windows类似,是一款系统软件.操作系统首先是一个计算机程序,使用计算机语言开发,比如C语言.VC语言.是计算机硬件和应用软 ...

  5. e课表项目第二次冲刺周期第三天

    昨天干了什么? 昨天和我们组的组员商量,确定了第二个界面的框架内容,即内容的输入和完成按钮,然后通过在网上搜索图片资源,然后我们利用ps软件,将图片通通设置了大小,进行了裁剪,最后为我们所利用,实现第 ...

  6. Faker——生成测试数据的PHP类库

    工作上用的是TP框架,每次测试功能的时候都要手动添加测试数据,词穷起名总是起一些test1.test2这种low到爆炸的用户名,这让我很难受.稍微翻阅了一些资料,发现laravel有一个生成测试数据的 ...

  7. 可能是把 ZooKeeper 概念讲的最清楚的一篇文章

    转载自:https://github.com/Snailclimb/JavaGuide/blob/master/%E4%B8%BB%E6%B5%81%E6%A1%86%E6%9E%B6/ZooKeep ...

  8. 子网掩码!如何划分子网掩码,计算IP地址

    作者:chli1806 一.子网掩码的含义和根据子网掩码划分子网一个IP地址必然属于某一个网络,或者叫子网.子网掩码就是用来指定某个IP地址的网络地址的,换一句话说,就是用来划分子网的.例如,一个A类 ...

  9. 安装VMware Tools显示灰色正确解决办法

    首先问题如下: 解决办法如下:1.关闭虚拟机: 2.在虚拟机设置分别设置CD/DVD.CD/DVD2和软盘为自动检测三个步骤: 3.再重启虚拟机,灰色字即点亮. 大功告成,如果解决了你的问题,点个赞鼓 ...

  10. Rancher 2.1平台搭建及使用

    一.概述 1.1.什么是Rancher Rancher是一套容器管理平台,它可以帮助组织在生产环境中轻松快捷的部署和管理容器. Rancher可以轻松地管理各种环境的Kubernetes,满足IT需求 ...