题目传送门


分析

显然如果存在长度大于一半的border那么必然存在小于一半的 border,所以容斥一下,

设 \(dp[i]\) 表示长度为 \(i\) 的不存在公共前后缀的字符串个数,那么 \(dp[i]=2^i-\sum_{j=1}^{\lfloor\frac{i}{2}\rfloor}dp[j]\times 2^{i-2j}\)

问题就是怎么求字典序第 \(k\) 个字符串,考虑试填字母a之后统计方案数是否足够,不够就填b,

有一些区别就是前缀是固定的所以2的幂次会相应减少,并且枚举的 \(j\) 需要判断是否存在这样的 border

这就需要KMP去判断当前填的 \(i\) 个字母有哪些 border


代码

#include <iostream>
#include <algorithm>
using namespace std;
const int N=71;
typedef unsigned long long ull;
int n,Q,flag,fail[N],v[N],s[N];
ull k,two[N],dp[N],f[N];
ull calc(int i){
int j=i;
while (j) v[j]=1,j=fail[j];
for (int j=i+1;j<=n;++j){
f[j]=two[j-i];
for (int k=1;k*2<=j;++k)
if (k<=j-i||v[k-(j-i)])
f[j]-=f[k]*two[max(0,j-k-max(i,k))];
}
for (int i=1;i<=n;++i) v[i]=0;
return f[n];
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
dp[0]=two[0]=1;
for (int i=1;i<=64;++i){
dp[i]=two[i]=two[i-1]<<1;
for (int j=1;j*2<=i;++j) dp[i]-=dp[j]*two[i-2*j];
}
for (cin>>Q;Q;--Q){
cin>>n>>k,cout<<dp[n]<<'\n';
if (n==1){
cout<<(k==1)?'a':'b'<<'\n';
continue;
}
if (k>dp[n]/2) flag=1,k=dp[n]-k+1;
else flag=0;
s[1]=0,f[1]=s[n]=1;
for (int i=2,j=0,J;i<n;++i){
s[i]=0,J=j;
while (j&&s[j+1]!=s[i]) j=fail[j];
if (s[j+1]==s[i]) ++j;
fail[i]=j,f[i]=!j;
ull t=calc(i);
if (t<k){
k-=t,s[i]=1,j=J;
while (j&&s[j+1]!=s[i]) j=fail[j];
if (s[j+1]==s[i]) ++j;
fail[i]=j,f[i]=!j;
}
}
for (int i=1;i<=n;++i) cout<<(char)(97+(s[i]^flag));
cout<<'\n';
}
return 0;
}

#KMP,容斥,dp#洛谷 5770 [JSOI2016] 无界单词的更多相关文章

  1. [JSOI2016]无界单词

    题目 题意:求\(\rm border\)长度为\(0\)的\(n\)位\(0,1\)字符串个数,并求字典序第\(k\)小的那一个. 首先是计数,正向不是很好算,考虑正难则反:设\(f_i\)表示长度 ...

  2. [JSOI2016]无界单词[动态规划、kmp]

    题意 题目链接 分析 对于第一问,枚举最终串最小的相同前后缀来统计答案. 由于最小的相同前后缀也是无界单词,所以可以考虑先求解子问题. 定义状态 \(f(i)\) 表示长度为 \(i\) 的串中有多少 ...

  3. HDU 5794 A Simple Chess (容斥+DP+Lucas)

    A Simple Chess 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5794 Description There is a n×m board ...

  4. [CF1086E]Beautiful Matrix(容斥+DP+树状数组)

    给一个n*n的矩阵,保证:(1)每行都是一个排列 (2)每行每个位置和上一行对应位置不同.求这个矩阵在所有合法矩阵中字典序排第几.考虑类似数位DP的做法,枚举第几行开始不卡限制,那么显然之前的行都和题 ...

  5. 【BZOJ3622】已经没有什么好害怕的了 容斥+DP

    [BZOJ3622]已经没有什么好害怕的了 Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output ...

  6. KMP字符串匹配 模板 洛谷 P3375

    KMP字符串匹配 模板 洛谷 P3375 题意 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.(如果 ...

  7. $bzoj2560$ 串珠子 容斥+$dp$

    正解:容斥+$dp$ 解题报告: 传送门$QwQ$ $umm$虽然题目蛮简练的了但还是有点难理解,,,我再抽象一点儿,就说有$n$个点,点$i$和点$j$之间有$a_{i,j}$条无向边可以连,问有多 ...

  8. 洛谷P4707 重返现世(扩展MinMax容斥+dp)

    传送门 我永远讨厌\(dp.jpg\) 前置姿势 扩展\(Min-Max\)容斥 题解 看纳尔博客去→_→ 咱现在还没搞懂为啥初值要设为\(-1\)-- //minamoto #include< ...

  9. Bzoj4753/洛谷P4432 [JSOI2016]最佳团体(0/1分数规划+树形DP)

    题面 Bzoj 洛谷 题解 这种求比值最大就是\(0/1\)分数规划的一般模型. 这里用二分法来求解最大比值,接着考虑如何\(check\),这里很明显可以想到用树形背包\(check\),但是时间复 ...

  10. [ZJOI2016]小星星(容斥+dp)

    洛谷链接:https://www.luogu.org/problemnew/show/P3349 题意相当于给一棵树重新赋予彼此不同的编号,要求树上相邻的两个节点在给定的另外一个无向图中也存在边相连. ...

随机推荐

  1. Linux驱动开发笔记(二):ubuntu系统从源码编译安装gcc7.3.0编译器

    前言   编译ubuntu驱动之前,发现使用的gcc是7.3.0,而使用apt管理和下载的都无法直接或间接安装gcc7.3.0,于是只能从源码安装gcc7.3.0编译器.   GCC 概述   GCC ...

  2. gin中间件&控制器

    中间件 Gin 框架允许开发者在处理请求的过程中,加入用户自己的钩子(Hook)函数.这个钩子函数就叫中间件,中间件适合处理一些公共的业务逻辑,比如登录认证.权限校验.数据分页.记录日志.耗时统计等. ...

  3. 【.Net Core】.Net Core 源码分析与深入理解 - 入口 Program.cs (一)

    研究原因:学习 .Net Core 两年有余,实际项目也使用了一年半,自己的技术已经到了瓶颈,需要有一个突破,我觉得首先研究架构师的设计思想,其次分析一下.Net Core的源码,这将会是一个很好的学 ...

  4. 深入理解String

    深入理解String String是Java中的一个类,是一个引用类型,用于表示字符串.它是不可变的(immutable),即一旦创建,其值就不能被修改.任何对String对象的修改操作都会创建一个新 ...

  5. 在写dockerfile时替换国内源

    众所周知,Debian是linux发行版中官方源最难用的一个,这个傻逼源让我再构建docker镜像时卡了很久. ​ 那么能不能替换构建dockerfile时使用的源呢?显然是可以的 ​ 在与Docke ...

  6. 【Azure 应用服务】Azure SignalR 是否可以同时支持近十万人在线互动

    什么是 Azure SignalR 服务? Azure SignalR Service 简化了通过 HTTP 向应用程序添加实时 Web 功能的过程. 这种实时功能允许服务将内容更新推送到连接的客户端 ...

  7. php7中的三元运算符的区别

    <?php $tmparr = ['cover'=>'http://img.immomo.com.cn']; echo isset($tmparr['cover'])."\n&q ...

  8. XAF新手入门 - 数据字典示例

    前言 通过前面文章的介绍,大家应该对模块与类型信息子系统有所了解,再通过一个示例来加深大家对它的理解. 在准备写这个系列文章之前,就准备是概念+示例的组合,这样大家对概念的理解会更深刻.之前的规划是在 ...

  9. 摆脱鼠标系列 - vscode vim - 自动切换到英文 - im-select

    为什么 摆脱鼠标系列 - vscode vim - 自动切换到英文 - im-select 省得每次都得按 shfit 下载软件 https://gitee.com/pengchenggang/im- ...

  10. 我的电脑 属性 代理 win10 不用的时候记得关闭,git python node 等