题目

AT_agc012_c [AGC012C] Tautonym Puzzle

题目描述

当字符串 $ x $ 满足以下条件时,称 $ x $ 为好字符串

  • 条件:$ x $ 可以表示为某个长度不少于 $ 1 $ 的字符串 $ y $ 重复两次所得的字符串 $ yy $。

例如,aabubobubo 等是好字符串,而空字符串、aabcabcabcabba 等都不是好字符串。

“ワシ”与猫头鹰设计了关于好字符串的谜题。请找出一个满足下列条件的字符串 $ s $。在本题的约束条件下,一定存在这样的字符串。

  • $ 1\leq |s|\leq 200 $
  • $ s $ 仅由用 $ 1 $ 至 $ 100 $ 的整数表示的 $ 100 $ 种字符构成。
  • $ s $ 的 $ 2^{|s|} $ 个子序列中,成为好字符串的子序列有 $ N $ 个。

题目分析

这显然是一道构造题目,高质量的构造题目。

我们注意到填什么似乎并不重要,重要的是种类不同。

因此有 \(200\) 个位置,我们先用 \(100\) 个位置从左到右依次放置 \(1,\dots,100\)。

我们考虑后半部分怎么与前面的匹配出 \(n\) 个合法的。

首先考虑一个最大的 \(k\) 使得 \(2^k-1\leq n\),将 \(n\) 分为 \(2^k-1\) 和 \(rest=n-2^k+1\) 两个部分进行计算。

第一个部分,我们可以只需要按顺序放置 \(k\) 个数就可以了,至于是什么得看第二个部分。

对于第二个部分,我们试图将其与 \(rest\) 的二进制扯上关系,如果说第 \(x\) 位(从后往前,从 \(0\) 开始)为 \(1\),我们希望多产生 \(2^x\) 的贡献,怎么弄呢?

要产生 \(2^x\) 的贡献其中一个方法就是当前在末尾放置一个数 \(a\),使得前面比它小的数有 \(x\) 个即可。

这个的方法不同,其中一种比较简单的方法是:前面直接放置偶数就可以了(\(\{2,4,6,\dots\}\)),然后后面补充奇数,比如说对于 \(rest=(101)_2\),得到后半部分的序列的第二部分为:\(\{5,1\}\)。

注意遍历的时候要从高位开始遍历,否则小奇数对大奇数也有可能产生贡献。

真是一道好题!

代码

时间复杂度 \(\mathcal{O}(len)\),其中 \(len\) 为最后答案的长度。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#define int long long
// #define N
using namespace std;
int n;
vector<int> ans;
signed main(){
cin >> n;
// cout << 200 << '\n';
// for (int i = 1;i <= 100;i ++) cout << i << ' ';
for (int i = 1;i <= 100;i ++) ans.push_back(i);
int k = 0;
for (;(1ll << k + 1) - 1ll <= n;k ++);
for (int i = 1;i <= k;i ++) ans.push_back(i * 2);
int rest = n - (1ll << k) + 1ll;
for (int i = k - 1;i >= 0;i --)
if ((rest >> i) & 1) ans.push_back(i * 2 + 1);
cout << ans.size() << '\n';
for (auto i : ans) cout << i << ' ';
return 0;
}

AT_agc012_c [AGC012C] Tautonym Puzzle 题目分析的更多相关文章

  1. 【AtCoder Grand Contest 012C】Tautonym Puzzle [构造]

    Tautonym Puzzle Time Limit: 50 Sec  Memory Limit: 256 MB Description 定义一个序列贡献为1,当且仅当这个序列 由两个相同的串拼接而成 ...

  2. SCTF 2014 pwn题目分析

    因为最近要去做ctf比赛的这一块所以就针对性的分析一下近些年的各大比赛的PWN题目.主防项目目前先搁置起来了,等比赛打完再去搞吧. 这次分析的是去年的SCTF的赛题,是我的学长们出的题,个人感觉还是很 ...

  3. 路由器漏洞复现分析第三弹:DVRF INTRO题目分析

    这个项目的目的是来帮助人们学习X86_64之外其他架构环境,同时还帮助人们探索路由器固件里面的奥秘. 本文通过练习DVRF 中INTRO 部分的题目来学习下MIPS 结构下的各种内存攻击. DVRF: ...

  4. 二分查找总结及部分Lintcode题目分析 2

    Search in a big sorted array,这个比之前的二分法模板多了一个很不同的特性,就是无法知道一个重要的条件end值,也是题目中强调的重点 The array is so big ...

  5. 【算法】题目分析:Aggressive Cow (POJ 2456)

    题目信息 作者:不详 链接:http://poj.org/problem?id=2456 来源:PKU JudgeOnline Aggressive cows[1] Time Limit: 1000M ...

  6. *CTF babyarm内核题目分析

    本文从漏洞分析.ARM64架构漏洞利用方式来讨论如何构造提权PoC达到读取root权限的文件.此题是一个ARM64架构的Linux 5.17.2 版本内核提权题目,目的是读取root用户的flag文件 ...

  7. pat乙级:模拟链表问题(汇总,包含所有pat中链表题目分析)

    更新:优化文章结构,增加了部分内容如(1110区块反转)和自己代码和他人代码分析.看完你就懂了 转载请注明出处和链接地址:(https://www.cnblogs.com/ahappyfool/p/1 ...

  8. SCJP_104——题目分析(5)

    18. public class Test { public static void add3(Integer i) { int val=i.intvalue(); val+=3; i=new Int ...

  9. SCJP_104——题目分析(2)

    3. public class IfTest{ public static void main(String args[]){ int x=3; int y=1; if(x=y) System.out ...

  10. SCJP_104——题目分析(1)

    1.1) public class ReturnIt{2) returnType methodA(byte x, double y){3) return (short)x/y*2;4) }5) }wh ...

随机推荐

  1. lim x→c⁡ f⁢(x) = L数学语言:∀ ϵ>0, ∃ δ>0 S.T. for all x≠c, if |x-c|<δ, then |f⁢(x)-L|<ϵ 常用记号: “∃ ”:“存在”或“可以找到”,“∀ ”: “对于任意的”或“对于每一个”, maxS:数集S极大值, minS:数集S极小值, supS:上确界(上界最小值), infS下确界(下界最大值)

    实数集Completeness Axiom(连续性公理) Q: 谬论: "实数集上, 怎么求出点A"相邻"的那一点, 或A点的"下一点"? 或 &qu ...

  2. SciTech-Logic:逻辑学-Introduction to Logic: Irvine - 5.5 传统对当方阵

    SciTech-Logic:逻辑学-Introduction to Logic: Irvine - 5.5 传统对当方阵 5.5 传统对当方阵 到目前为止,对直言命题的分析使我们能够进一步研究这些直言 ...

  3. win10专业版usb接口被禁用的问题

    有深度系统的小伙伴,在win10专业版插入U盘,却没有任何反应,仔细检查发现USB接口被禁用了,不论插哪个USB口都无法正常使用的问题.那如何解除usb接口禁用呢?本文中,深度技术小编就来分享详细的处 ...

  4. IPD 项目管理软件工具对比:2025 年最佳选择指南

    在当今竞争激烈的研发环境中,选择合适的ipd项目管理软件对于提高团队效率和项目成功率至关重要.随着技术的不断进步,ipd项目管理软件工具也在不断演进,为研发团队提供更加智能和全面的解决方案.本文将为您 ...

  5. T527的GPU-Mali-G57驱动与weston图形界面

    盈鹏飞嵌入式最近发布的基于全志A527/T527的开发板-AHD-X527,以下演示内容在开发板上运行通过, 以下是盈鹏飞嵌入式AHD-X527开发板的简要介绍: 产品功能: 产品特性 : 采用All ...

  6. 虚拟机-Linux开发板交叉编译问题记录

    遇到一堆很久之前见过的问题,重新解决一次. 1.虚拟机没法上网 发现虚拟机浏览器上不了网,运行ifconfig查看,发现要么没有IP地址,要么只有IPv6的地址.最后发现是昨天VMware卡死了,启动 ...

  7. 不懂Modbus的人干不了能源管理

    不了解Modbus的人难以从事能源管理工作.‌这是因为Modbus在能源管理系统中扮演着至关重要的角色,它是一种广泛应用于工业自动化领域的通信协议,特别是在能源管理.楼宇自动化等领域发挥着关键作用.M ...

  8. AI绘画:关键词指南

    公式 主题(加下面的) + 环境(背景,周围) + 气氛(烈日下,雾蒙蒙,恐怖的,风暴席卷的) + 灯光(顶光,雾气光,漫反射的,强对比的) + 色彩(低饱和度,颜色鲜艳的,花里胡哨的,强反射的主色调 ...

  9. K8S容器内部署相关应用的UID及权限设置

    1.grafana 一.UID:472 通过kubeVsphere进入正常运行后的容器内查看得知: 如果容器挂载的PVC所在的PV类型为HostPath,则需要找到对应的PV HostPath路径,赋 ...

  10. JavaScript 多人协作的“修罗场”:如何优雅地规避函数重名问题?

    从刀耕火种的全局变量到模块化工业革命,探索前端协作的进化之路 引言 在多人协作的 JavaScript 项目中,你是否经历过这样的场景:明明只添加了一个小功能,却导致整个页面的弹窗不再工作?经过数小时 ...