[JSOI2016]无界单词

题目

题意:求\(\rm border\)长度为\(0\)的\(n\)位\(0,1\)字符串个数,并求字典序第\(k\)小的那一个。

首先是计数,正向不是很好算,考虑正难则反;设\(f_i\)表示长度为\(i\)的\(\rm |border|=0\)的串的个数

一个串可能有多个\(\rm border\),我们考虑在其最小的\(\rm border\)长度\(j\)时计算它

则有\(f_i=2^i-\sum_{j=1}^{\lfloor \frac{i}{2}\rfloor}f_j2^{i-2\times j}\);不用考虑长度大于\(\lfloor \frac{i}{2}\rfloor\)的\(\rm border\)是因为当\(\rm border\)长度大于\(\lfloor \frac{i}{2}\rfloor\)的时候一定存在一个小于\(\lfloor \frac{i}{2}\rfloor\)的\(\rm border\)。

第二问,考虑大力二分;二分一个串,求所有字典序小于等于这个串中,\(\rm border=0\)的有多少个

设\(g_{0,i}\)表示长度为\(i\)且字典序严格小于当前串的前\(i\)位的串的个数;\(g_{1,i}\)表示长度为\(i\)且等于当前串的前\(i\)位的串的个数;不难发现\(g_{1,i}=[i\notin \rm Border]\)

还是跑上面那个容斥,从\(g_{1,j}\)向\(g_{0,i}\)转移的时候要在套一个二分判断一下

代码,其中有一些诡异的行为都是为了防爆unsigned long long

#include<bits/stdc++.h>
#define re register
#define LL unsigned long long
int n,T;LL m,f[66],v[66];
LL g[2][66];int nxt[66],a[66];
inline void split(LL nw) {
    for(re int i=1;i<=n;i++) a[i]=nw>>(n-i)&1;
}
inline LL Calc(LL val,LL R,int i,int j,LL H) {
    LL L=0,k=0;
    while(L<=R) {
        LL mid=(L>>1ull)+(R>>1ull);
        if((L&1ull)&&(R&1ull)) mid++;
        LL t=(((val<<i)|mid)<<j)|val;
        if(t<H) k=mid+1,L=mid+1;else {if(mid) R=mid-1;else break;}
    }
    return k;
}
inline LL calc(LL nw) {
    split(nw);nxt[1]=0;
    for(re int i=2;i<=n;i++) {
        int p=nxt[i-1];
        while(a[p+1]!=a[i]&&p) p=nxt[p];
        if(a[p+1]==a[i]) nxt[i]=p+1;else nxt[i]=0;
    }
    memset(g,0,sizeof(g));
    LL x=a[1];g[1][1]=1;
    if(x) g[0][1]=1;v[1]=x;
    for(re int i=2;i<=n;i++) {
        x=(x<<1ull)|a[i];v[i]=x;
        g[0][i]=x;
        for(re int j=1;j+j<=i;++j) {
            g[0][i]-=g[0][j]*(1ull<<(i-j-j));
            if(g[1][j]) g[0][i]-=Calc(v[j],(1ull<<(i-j-j))-1,i-j-j,j,x);
        }
        if(!nxt[i]) g[1][i]=1;
    }
    return g[0][n]+g[1][n];
}
int main() {
    scanf("%d",&T);f[1]=2;
    while(T--) {
        std::cin>>n>>m;
        for(re int i=2;i<=n;i++) {
            f[i]=1ull<<(i-1);f[i]--;f[i]+=1ull<<(i-1);
            for(re int j=1;2*j<=i;++j) f[i]-=(1ull<<(i-2*j))*f[j];
            f[i]++;
        }
        std::cout<<f[n]<<std::endl;
        LL l=0,r=(1ull<<(n-1)),ans=0;r+=r-1;
        while(l<=r) {
            LL mid=(l>>1ull)+(r>>1ull);
            if((l&1ull)&&(r&1ull)) mid++;
            if(calc(mid)>=m) {ans=mid;if(mid) r=mid-1;else break;}
            else l=mid+1;
        }
        split(ans);
        for(re int i=1;i<=n;i++)putchar(a[i]+'a');puts("");
    }
}

原文地址:https://www.cnblogs.com/asuldb/p/12028847.html

时间: 2024-08-30 14:36:31

[JSOI2016]无界单词的相关文章

「JSOI2016」无界单词

题目描述 对于一个单词 $S$ ,如果存在一个长度 $l$,满足 $0\lt l\lt |S|$,并且使得 $S$ 长度为 $l$ 的前缀与 $S$ 长度为 $l$ 的后缀相同,JYY 则称 $S$ 是有界的.比如 `aabaa` 和 `ababab` 就都是有界的字符串.如果一个单词不存在这样的 $l$ ,则 JYY 称之为无界单词. 现在考虑所有仅由字母 `a` 和 `b` 组成的长度为 $N$ 的字符串,JYY想知道:1. 一共有多少个无界单词?2. 这些无界单词中,按字典序排列第 $K$

无界鼠标 (Mouse without Borders)简单使用教程

无界鼠标是 Microsoft Garage"车库"团队的一个创新软件项目,他可以让你在最多4台PC中实现鼠标指针在屏幕的边缘移动到另一台电脑去,进而方便地操作它们.不仅如此,无界鼠标还实现了不同电脑间的文件拷贝,并且按着鼠标可以将文件拖放至其他电脑中.(不同电脑之间拖放的文件会保存在拖放目录下MouseWithoutBorders文件夹中)有点类似于单PC多显示器的分屏操作. 下载后直接运行,(无界鼠标需要微软.NET 2.0支持,如果系统没有安装会自动提示安装)点击"ac

无我,无界

不垢不净,不生不灭人,不过地球沧海一粟地球,只不过宇宙沧海一粟宇宙,也不过时空沧海一粟各种物质的存在,只是无数微粒子的有机组合.人也如此,或生或死,只是一种表象,一种形式而已 物理上讲就是不同能量形式,化学上讲就是不同元素而已无我,无界人生短暂,珍惜身边的点点滴滴,感谢时空匆匆之际有个你我珍惜生命,尊重生命,融入社会,爱护自然

家电网购规模近5000亿背后,京东连续5年第一,无界零售赋能新蓝海

2017年中国家电网购市场有多大?<2017年家电网购分析报告>告诉你:我国B2C家电网购市场(含移动终端)规模达到4906亿元,同比增长27.6%.一.2017年国内家电网购规模近5000亿元,京东市场份额第一2月8日,由工业和信息化部赛迪研究院.中国电子报社主办的第十届中国家电网购高峰论坛在北京隆重举行.论坛同期发布了<2017家电网购分析报告>(以下简称<家电报告>). 报告显示,2017年,我国B2C家电网购市场(含移动终端) 规模达到4906亿元,同比增长27

始于互联,不止无界:智能车联网的三重生态反应

提到车联网,我们总会将这项技术与自动驾驶关联在一起.车与车之间在云端互联,擦肩而过时向彼此Say hi,通过对车距.转向的精准沟通减少交通事故发生的可能. 可在自动驾驶发展的萌芽阶段,不同厂商之间应用着不同的车联网系统,系统之间存在的隔阂让车与车之间很难进行对话.但车联网的应用前景绝不止步于此,除了连接车与车之外,车联网还存在着无尽想象空间,尤其是在加入AI技术之后. 想象一下日常开车的场景:双手紧握方向盘,眼观六路耳听八方,心里想的却是空调温度是不是太低了.这个电台节目好无聊.车里还有多少玻璃

1星|《无界零售》:基于企业公关稿的畅想

基于京东.阿里.苏宁等企业的公关稿,畅想未来的新零售. 缺乏对零售业的现状的陈述,畅想部分也基本是堆砌媒体上的新名词新概念. 总体评价1星,没有阅读价值. 以下是书中一些内容的摘抄: 1:2015年,刘强东提出:“未来的零售不分线下线上,将是无边无界的.”于是就有了“无界零售”.之后,无论是电商,还是传统零售业,都逐渐走向理性,从高调对抗转向理性合作,P11 2:可以看到,从百货商店.连锁商店.超级市场,再到电子商务,零售历史的发展一直都在围绕“成本.效率.体验”做文章.每一次新业态的出现,都至

无界面上(linux)生成测试报告(3)

无界面上(linux)生成测试报告 1.待jmx文件运行完成后,键入命令进入到jtl文件下: #cd testresult#bin目录下使用此命令,进入到jtl文件下 #jmeter -g pushGeomquota.jtl -e -o report#生成测试报告 #zip -q -r report.zip report/ #压缩文件夹中的内容 #sz report.zip#然后导出至windows本地即可 2.解压report.zip文件,浏览器打开html文件即可,如下图所示 原文地址:ht

无界面上(linux)运行jmeter(2)

无界面上(linux)运行jmeter 1.先在bin目录下面创建一个文件夹testplan用来存放脚本(.jmx文件),然后在创建一个文件夹testresult用来存放脚本执行后的结果(.jtl文件),结果文件是可以在jmeter可视化界面打开的,它保存了脚本执行过程中的各种结果非常全面,结果树.聚合报告.表格查看结果等都可以将它打开看到相应数据 命令如下: #mkdir testplan#在bin目录下面创建testplan文件夹 #cd ../#回到bin目录 #mkdir testres

UVA 156-Ananagrams(字符串排序按序输出无重复单词)

Ananagrams Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Description  Ananagrams  Most crossword puzzle fans are used to anagrams--groups of words with the same letters in different orders--for example OPTS, SPO