题目传送门


分析

显然如果存在长度大于一半的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. win32 - 在进程之间获取事件通知(CreateEvent)

    只需要记住使用OpenEvent来同步Event对象. Project A: #define _CRT_SECURE_NO_WARNINGS #include <Windows.h> #i ...

  2. WSL2镜像文件压缩

    WSL2的镜像文件(*.vhdx)支持自动扩容,但是一般不会自动缩容.一旦某次存放过大文件以后,即使后续删除,镜像文件体积仍然不会缩小,导致大量磁盘空间浪费.因此,可以定期对镜像文件进行手动压缩. 镜 ...

  3. 国内如何快速访问GitHub

    1.国内如何快速访问gibhub -FQ的方法无非就是用软件,这种就不介绍了 -本次介绍的是修改本地系统主机hosts文件,绕过国内dns解析,达到快速访问github 打开https://tool. ...

  4. Mysql 删除binlog日志方法

    方法1 RESET MASTER; 解释: 该方法可以删除列于索引文件中的所有二进制日志,把二进制日志索引文件重新设置为空,并创建一个以.000001为后缀新的二进制日志文件. 该语法一般只用在主从环 ...

  5. Rust 登上了开源头条「GitHub 热点速览」

    抱歉!上周因为出月刊工作量比较大,所以「GitHub 热点速递」暂停了一期,必须要给守着更新的读者道个歉,以后每周二的「热点速递」会按时更新,下不为例. 说回本周的热门开源项目,Rust 语言可谓是出 ...

  6. Docker安装好后服务启动不了

    安装 安装方式参考地址:https://www.docker.org.cn/book/install/install-docker-on-rhel-29.html 问题 安装好后启动不了服务器.查看状 ...

  7. 【技术积累】MySQL优化及进阶

    MySql优化及进阶 一.MySQL体系结构 连接层:是一些客户端和链接服务,包含本地sock 通信和大多数基于客户端/服务端工具实现的类似于 TCP/IP的通信 服务层:大多数的核心服务功能,如SQ ...

  8. matlab修改读取mat文件后的变量名

    代码如下: %% str1=load('CH1.mat'); val_names = fieldnames(str1); % 获取结构体后那个未知的变量名 data1 = getfield(str1, ...

  9. Multi-Runtime多运行时架构

    概念 Multi-Runtime Multi-Runtime 是一种服务端架构思路,把应用里的所有中间件挪到 Sidecar 里,使得"业务运行时"和"技术运行时&quo ...

  10. STM32 SPI DMA 源码解析及总结

    一 前言 最近在调试stm32的SPI时候i,遇到了一个非常诡异的问题.中间花费了不少时间才把问题搞定.这中间暴露的问题值得反思.借此机会,还是梳理一下stm32的SPI的代码做一个总结吧. 二 初始 ...