写题五分钟读题两小时系列……

看懂题的话不算难,然而我去看了大佬的blog才看懂题……

题目大意是:一个原字符串,其中有一种通配符,合法串的定义是这个串(不含通配符))可以匹配原串并且这个串最多分成k段就能使每一段字典序单调不降。求在所有合法串中字典序第r大的。

设f[i][j][k]表示第i个字符选j,至少需要分成k段的方案数,倒着dp,特判一下通配符,比较基础懒就不多说了

然后对于每个f[i][j],把k维变成前缀和的形式,因为能分为k段就能分为k+1段。(这里其实当i<k的时候是不对的,但是我写的时候没有特判也过了就没改= =)

然后正着算答案,有点像splay上求k大数的感觉,就是一边匹配一边把r减去当前方案之前(字典序小于当前方案)的方案数。

#include<iostream>
#include<cstdio>
using namespace std;
const int N=50005;
int n,m,a[N],h[305];
long long r,ans,f[N][5][15];
char s[N],b[5];
int main()
{
h['A']=0,h['C']=1,h['G']=2,h['T']=3,h['N']=4;
b[0]='A',b[1]='C',b[2]='G',b[3]='T';
scanf("%d%d%lld%s",&n,&m,&r,s+1);
for(int i=1;i<=n;i++)
a[i]=h[s[i]];
if(a[n]==4)
f[n][0][1]=1,f[n][1][1]=1,f[n][2][1]=1,f[n][3][1]=1;
else
f[n][a[n]][1]=1;
for(int i=n-1;i>=1;i--)
{
if(a[i]==4)
{
for(int j=0;j<=3;j++)
for(int k=1;k<=m;k++)
for(int l=0;l<=3;l++)
f[i][j][k]+=f[i+1][l][k-(j>l)];
}
else
{
for(int k=1;k<=m;k++)
for(int l=0;l<=3;l++)
f[i][a[i]][k]+=f[i+1][l][k-(a[i]>l)];
}
}
for(int i=1;i<=n;i++)
for(int j=0;j<=3;j++)
for(int k=1;k<=m;k++)
f[i][j][k]+=f[i][j][k-1];
for(int i=1,j;i<=n;i++)
{
for(j=0;j<=3;j++)
{
long long sum;
if(j<a[i-1])
sum=f[i][j][m-1];
else
sum=f[i][j][m];
if(r>sum)
r-=sum;
else
break;
}
a[i]=j;
if(a[i]<a[i-1])
m--;
printf("%c",b[j]);
}
return 0;
}

最新文章

  1. 如何预览将要上传的图片-使用H5的FileAPI
  2. Office2010安装错误1402问题(我安装成功了)
  3. ooize的使用01
  4. WinForm 多窗体
  5. MATLAB plot函数的一些参数
  6. 我的第一个 Rails 站点:极简优雅的笔记工具-Raysnote
  7. 怎么用C#获取Scenario step在specflow里
  8. 一个小型的DBHelper的诞生(1)
  9. Next Greater Element I
  10. Failed to connect to GitHub to update the CocoaPods/Specs specs repo - Please check if you are offline, or that GitHub is down
  11. discuz全新安装升级,导入旧数据过程,顺便gbk转utf8
  12. SAM求多个串的最长公共子串
  13. [Swift]LeetCode684. 冗余连接 | Redundant Connection
  14. OpenStack的基础原理
  15. 用python优雅打开文件及上下文管理协议
  16. scrapy 关于 rule, 关于多页
  17. DOM3级的变化
  18. 认识OpenStack中的flatnetwork
  19. Docker Swarm——集群管理
  20. js异步原理与 Promise

热门文章

  1. HDU——2444 The Accomodation of Students
  2. 数据库中的DDL/DML/DCL解释(转)
  3. 【转】c++ 如何批量初始化数组 fill和fill_n函数的应用
  4. History(历史)命令用法 15 例
  5. Java中正则Matcher类的matches()、lookAt()和find()的差别
  6. 火狐浏览器Firefox 如何使用iMacros 自动填写网页表单
  7. POJ-2240 -Arbitrage(Bellman)
  8. Angular2.x-主/细节组件
  9. Exception from container-launch: org.apache.hadoop.util.Shell$ExitCodeException
  10. 【SICP练习】149 练习4.5