[JSOI2016] 无界单词
[JSOI2016] 无界单词
一道普通的 .
首先我们很容易可以知道, 一个串的最短的 的长度一定 串长的一半.
证明很简单, 如果有一个长度 一半的 那么这个 的前后有重叠, 重叠段就是一个更短的 .
同理我们也可以得到, 最短 一定是没有 的.
然后暴力枚举最短 的长度.
我们设 表示长度为 的无界单词的个数, 则转移:
复杂度 .
第一问就完成了.
接下来考虑第二问.
我们需要输出一个串, 使得它为字典序为第 大的无界单词.
这里我们试填, 假设当前位为 然后求出最大的字典序是多少, 如果 , 则当前位为 , 否则为 .
然后怎么求最大的字典序呢? 其实就是填完这几位后没有 的方案数.
还是设 表示长度为 的无界单词数, 当前枚举到第 位, 显然 只能为 , . 然后像第一问一样 就行了, 只不过需要分类讨论, 枚举 表示串长, 表示最短的 长.
- , 跟第一问一样, 确定了前后 位, 然后剩下的 位随便选.
- , 这样的话, 前后缀出现重叠, 我们就比较一下重叠的部分, 如果相同, 就 , 否则说明当前不存在长度为 的 .
- , 同样的, 确定了前面 位以及后面 位, 剩下的随便选.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
ull read() {
ull x = 0, f = 1;
char ch = getchar();
while (!isdigit(ch)) {
if (ch == '-') f = -1;
ch = getchar();
}
while (isdigit(ch)) {
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
return x * f;
}
const int N = 100;
ull f[N], pw[N];
char s[N];
bool check(int n) {
for (int l = 1; l <= n >> 1; l++) {
int flag = 1;
for (int i = 1; i <= l; i++) {
if (s[i] != s[n - l + i]) {
flag = 0;
break;
}
}
if (flag) return false;
}
return true;
}
void solve() {
int n = read();
ull k = read();
for (int i = 1; i <= n; i++) f[i] = pw[i];
for (int i = 1; i <= n; i++)
for (int j = 1; j <= i >> 1; j++)
f[i] -= f[j] * pw[i - (j << 1)];
if (n == 64) f[n]++;
printf("%llu\n", f[n]);
for (int l = 1; l <= n; l++) {
s[l] = 'a';
for (int i = 1; i <= l; i++) f[i] = check(i);
for (int i = l + 1; i <= n; i++) {
f[i] = pw[i - l];
for (int j = 1; j <= i >> 1; j++) {
if (j >= l) f[i] -= f[j] * pw[i - (j << 1)];
else if (j >= i - l) {
for (int a = i - j + 1, b = 1; a <= l; a++, b++) {
if (s[a] != s[b]) {
f[i] += f[j];
break;
}
}
f[i] -= f[j];
}
else f[i] -= f[j] * pw[i - l - j];
}
}
if (f[n] < k) {
k -= f[n];
s[l] = 'b';
}
}
for (int i = 1; i <= n; i++) printf("%c", s[i]);
printf("\n");
}
int main() {
for (int i = 0; i < 64; i++) pw[i] = 1ull << i, pw[64] += pw[i];
int T = read();
while (T--) solve();
return 0;
}
这个题画图会好理解很多, 所以有时候做题没思路可以在纸上画画图ヾ(✿゚▽゚)ノ.
看不见我看不见我看不见我
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合终身会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· golang中写个字符串遍历谁不会?且看我如何提升 50 倍
· C# 代码如何影响 CPU 缓存速度?
· 智能桌面机器人:使用 .NET 为树莓派开发 Wifi 配网功能
· C# 模式匹配全解:原理、用法与易错点
· 记一次SSD性能瓶颈排查之路——寿命与性能之间的取舍
· 时隔半年,拾笔分享:来自一个大龄程序员的迷茫自问
· 《程序员的底层思维》读后感
· 曾经风光无限的 Oracle DBA 已经落伍了吗?
· 不写一行代码 .NET 使用 FluentCMS 快速构建现代化内容管理系统(CMS)
· WineHQ 发布的 Framework Mono 6.14 的这个特性对Windows Form