@atcoder - AGC024F@ Simple Subsequence Problem
@description@
给定由若干长度 <= N 的 01 字符串组成的集合 S。请找到长度最长的串 t(如果有多个选字典序最小的),使得存在 >= K 个 S 中的字符串,使得 t 是这些字符串的子序列。
@solution@
先看看怎么检验串 t 是否为某个串 s 的子序列:从前往后匹配,贪心地找最前面一个能够匹配上的。
注意到匹配的过程可以建图:每个种类的串 s 建点,向第一次出现的 0/1 对应的后缀连边。
每个点的连边是 O(1),因此假如把所有 <= N 的串建这个图,实际得到的图也不会很大。
于是就有一个思路:枚举 t,每次将 S 中的串对应的点在这个图上进行移动,看剩余的点是否依然 >= K 个。
看似会 TLE,然而可以修正一下:如果两个字符串走到了同一个点,下一次只移动这一个点即可。
看似还会 TLE,实际上可以过了。
因为每个长度为 p 的字符串会有 2^p 种可能性,而它继续往下匹配只会剩下 2^(N-p) 种匹配可能。因此每一个 p 都是 O(2^N) 的复杂度。
因此总复杂度为 O(N*2^N) (应该是吧,没有认真算过)。
@accepted code@
#include <cstdio>
int ch[2][1<<22], id[22][1<<21], cnt;
void get() {
id[0][0] = (cnt++), ch[0][id[0][0]] = ch[1][id[0][0]] = -1;
for(int i=1;i<=20;i++) {
int t = (1 << i), k = (t >> 1);
for(int s=0;s<t;s++) {
id[i][s] = (cnt++);
int p = (s & k), q = (p ? 1 : 0);
ch[q][id[i][s]] = id[i-1][s^p];
ch[!q][id[i][s]] = ch[!q][id[i-1][s^p]];
}
}
}
int a[22][1<<22], siz[22], c[22][1<<22], num[22][1<<22];
int ans[22], N, K;
void dfs(int d, int s) {
if( ans[d] == -1 ) ans[d] = s;
for(int p=0;p<=1;p++) {
int tot = 0;
for(int i=0;i<siz[d];i++) {
int to = ch[p][a[d][i]];
if( to == -1 ) continue;
if( num[d + 1][to] == -1 )
num[d + 1][a[d + 1][siz[d + 1]] = to] = siz[d + 1], siz[d + 1]++;
tot += c[d][i], c[d + 1][num[d + 1][to]] += c[d][i];
}
if( tot >= K ) dfs(d + 1, (s << 1) | p);
for(int i=0;i<siz[d + 1];i++)
num[d + 1][a[d + 1][i]] = -1, c[d + 1][i] = 0;
siz[d + 1] = 0;
}
}
char s[1<<21];
int main() {
scanf("%d%d", &N, &K), get();
for(int i=0;i<=N;i++)
for(int j=0;j<cnt;j++)
num[i][j] = -1;
for(int i=0;i<=N;i++) {
scanf("%s", s);
int t = (1 << i);
for(int j=0;j<t;j++) {
if( s[j] == '1' )
num[0][a[0][siz[0]] = id[i][j]] = siz[0], c[0][num[0][id[i][j]]]++, siz[0]++;
}
ans[i] = -1;
}
dfs(0, 0);
for(int i=N;i>=0;i--) {
if( ans[i] != -1 ) {
for(int j=i-1;j>=0;j--)
putchar(((ans[i] >> j) & 1) + '0');
puts(""); return 0;
}
}
}
@details@
事实证明再怎么精打细算还是有想象之外的越界危险。
还不如直接数组开大 2 倍。
@atcoder - AGC024F@ Simple Subsequence Problem的更多相关文章
- [题解] [AGC024F] Simple Subsequence Problem
题目大意 有一个 01 串集合 \(S\),其中每个串的长度都不超过 \(N\),你要求出 \(S\) 中至少是 \(K\) 个串的子序列的最长串,如果有多解,输出字典序最小的那组解. 由于 \(S\ ...
- BZOJ 3489: A simple rmq problem
3489: A simple rmq problem Time Limit: 40 Sec Memory Limit: 600 MBSubmit: 1594 Solved: 520[Submit] ...
- ZOJ 3686 A Simple Tree Problem
A Simple Tree Problem Time Limit: 3 Seconds Memory Limit: 65536 KB Given a rooted tree, each no ...
- hdu4976 A simple greedy problem. (贪心+DP)
http://acm.hdu.edu.cn/showproblem.php?pid=4976 2014 Multi-University Training Contest 10 1006 A simp ...
- hdu 1757 A Simple Math Problem (乘法矩阵)
A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- HDU1757 A Simple Math Problem 矩阵快速幂
A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- hdu------(1757)A Simple Math Problem(简单矩阵快速幂)
A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- bzoj 3489: A simple rmq problem k-d树思想大暴力
3489: A simple rmq problem Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 551 Solved: 170[Submit][ ...
- SPOJ LIS2 Another Longest Increasing Subsequence Problem 三维偏序最长链 CDQ分治
Another Longest Increasing Subsequence Problem Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://a ...
随机推荐
- jquery.autocomplete的使用-----------------------摘抄别人的
作者:lxhwss | 2011/10/11 9:46:38 | 阅读43次 document.write(”<script language=javascript src=’/js/2.js’ ...
- 自定义spring-boot-starter
需求背景: Springboot是Spring旗下优秀的子项目之一,其核心理念之一:约定优于配置.通过自动化的配置极大的提升了我们的开发效率,目前已集成诸多组件的starter起步依赖,帮助我们更加快 ...
- UVA10529 Dumb Bones (完成度:40%)
题目链接:https://vjudge.net/problem/UVA-10529 知识点: 概率与期望,DP. 题目大意: 现要放置 \(n\) 个多米诺骨牌,且每放置一块多米诺骨牌有 \(P_l\ ...
- Java线程的启动与中止
一.线程与进程的关系 关于进程与线程,百度百科上是这样描述的: 进程(Process) 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础. 在当 ...
- Docker 入门:镜像
主要内容: 什么是镜像 下载镜像 pull 设置下载加速源 查看镜像 上传镜像 push 什么是镜像(image) 镜像是一个文件系统,提供了容器运行时需要用到的文件和参数配置.相当于平时在使用某个软 ...
- 《腾讯网UED体验设计之旅》读后感
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- 路由器硬改+刷OpenWrt+挂载摄像头+U盘
标题: 路由器硬改+刷OpenWrt+挂载摄像头+U盘 作者: 梦幻之心星 347369787@QQ.com 标签: [路由器, OpenWrt, 摄像头, 固件] 目录: 路由器 日期: 2019- ...
- Rocket - debug - TLDebugModuleInner - Hart Bus Access
https://mp.weixin.qq.com/s/deNMEyJ1idJDVoZwwo0A1A 简单介绍TLDebugModuleInner中核心总线访问(Hart Bus Access). 参考 ...
- js 识别二维码
本文引用analyticCode.js.llqrcode.js实现识别二维码功能 html代码: <div class="box" id="analytic&quo ...
- Java实现 蓝桥杯 算法训练 字串统计
算法训练 字串统计 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最 ...