#KMP,容斥,dp#洛谷 5770 [JSOI2016] 无界单词
分析
显然如果存在长度大于一半的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] 无界单词的更多相关文章
- [JSOI2016]无界单词
题目 题意:求\(\rm border\)长度为\(0\)的\(n\)位\(0,1\)字符串个数,并求字典序第\(k\)小的那一个. 首先是计数,正向不是很好算,考虑正难则反:设\(f_i\)表示长度 ...
- [JSOI2016]无界单词[动态规划、kmp]
题意 题目链接 分析 对于第一问,枚举最终串最小的相同前后缀来统计答案. 由于最小的相同前后缀也是无界单词,所以可以考虑先求解子问题. 定义状态 \(f(i)\) 表示长度为 \(i\) 的串中有多少 ...
- 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 ...
- [CF1086E]Beautiful Matrix(容斥+DP+树状数组)
给一个n*n的矩阵,保证:(1)每行都是一个排列 (2)每行每个位置和上一行对应位置不同.求这个矩阵在所有合法矩阵中字典序排第几.考虑类似数位DP的做法,枚举第几行开始不卡限制,那么显然之前的行都和题 ...
- 【BZOJ3622】已经没有什么好害怕的了 容斥+DP
[BZOJ3622]已经没有什么好害怕的了 Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output ...
- KMP字符串匹配 模板 洛谷 P3375
KMP字符串匹配 模板 洛谷 P3375 题意 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.(如果 ...
- $bzoj2560$ 串珠子 容斥+$dp$
正解:容斥+$dp$ 解题报告: 传送门$QwQ$ $umm$虽然题目蛮简练的了但还是有点难理解,,,我再抽象一点儿,就说有$n$个点,点$i$和点$j$之间有$a_{i,j}$条无向边可以连,问有多 ...
- 洛谷P4707 重返现世(扩展MinMax容斥+dp)
传送门 我永远讨厌\(dp.jpg\) 前置姿势 扩展\(Min-Max\)容斥 题解 看纳尔博客去→_→ 咱现在还没搞懂为啥初值要设为\(-1\)-- //minamoto #include< ...
- Bzoj4753/洛谷P4432 [JSOI2016]最佳团体(0/1分数规划+树形DP)
题面 Bzoj 洛谷 题解 这种求比值最大就是\(0/1\)分数规划的一般模型. 这里用二分法来求解最大比值,接着考虑如何\(check\),这里很明显可以想到用树形背包\(check\),但是时间复 ...
- [ZJOI2016]小星星(容斥+dp)
洛谷链接:https://www.luogu.org/problemnew/show/P3349 题意相当于给一棵树重新赋予彼此不同的编号,要求树上相邻的两个节点在给定的另外一个无向图中也存在边相连. ...
随机推荐
- 【Android 逆向】VM Kali 中 charles 抓android https 协议
1. 虚拟机调成桥接模式(不用选择 复制物理网络链接状态) 2. 虚拟机中 打开 Charles 4. 选择 Proxy ->SSL Proxying Settings 1. 选择SSL Pro ...
- 记录问题:goland无法识别sdk的问题
goland版本:2020 go版本:1.20.3最新版 在goland中配置GOROOT时找不到sdk 解决版本: > cd /usr/local/go # 我本地go的安装目录 > c ...
- itertools.chain.from_iterable()将嵌套列表合并成一个
from itertools import chain a = [[1,2],[3,4]] print(chain.from_iterable(a)) # [1,2,3,4]
- 数据抽取平台pydatax介绍--实现和项目使用
数据抽取平台pydatax实现过程中,有2个关键点: 1.是否能在python3中调用执行datax任务,自己测试了一下可以,代码如下: 这个str1就是配置的shell文件 try: resu ...
- 【C# .Net】继承重写父类方法,C# 与 JAVA的不同之处
一直都没仔细研究c#重写,new关键字的作用,最近在回头看书,复习C#基础的时候才发现了 C# 重写和 JAVA大不一样的地方. C# 提供特定实现的子类可以重写(override)标识为 virtu ...
- ElkStack-MACOS搭建
目录 简介 Elasticsearch Logstash/Filebeats Kibana 架构流程 安装配置 版本 先决条件 brew Elasticsearch mac安装elasticsearc ...
- 【Azure 应用服务】Azure SignalR 是否可以同时支持近十万人在线互动
什么是 Azure SignalR 服务? Azure SignalR Service 简化了通过 HTTP 向应用程序添加实时 Web 功能的过程. 这种实时功能允许服务将内容更新推送到连接的客户端 ...
- 使用grafana+Prometheus监控时PromQL内置函数详解
1.Prometheus简介 Prometheus(中文名:普罗米修斯)是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB). Prometheus使用Go语言开发, 是Googl ...
- Effective C++ 第一章:让自己习惯C++
Effective C++ 第一章:让自己习惯C++ 引言 最近在阅读这本<effective C++ 改善程序与设计的55个具体做法>这本书,为了以后忘记的时候回顾,写一些笔记,每次笔记 ...
- 使用fastJson中的JSONObject对象简化POST请求传参-2022新项目
一.业务场景 Java项目开发中,经常会用到远程调用,不管是POST请求,Feign远程调用,还是使用Resttemplate中的POST方法等等都需要传递参数. 可是如何更好的传递参数呢?之前自己开 ...