BZOJ 4698: Sdoi2008 Sandy的卡片
4698: Sdoi2008 Sandy的卡片
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 106 Solved: 40
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
2 1 2
3 4 5 9
Sample Output
HINT
Source
首先,对于题目中的匹配,可以转换成两个相邻数字之间差值的匹配问题。因此对于每个数字串,先前后做差得到新的数字串,然后把N个新串连起来求后缀数组。二分答案,在后缀数组中找出所有联系的height值>=k的区间,判断是否能满足存在N个在不同串中开始的后缀,如果能,就是一个合法的k。
调了好久都不对,满脸黑线,一怒之下打开Vim,参考hzwer的代码,没加tab就一A了。
#include <bits/stdc++.h>
using namespace std;
#define N 1005
#define M 1000005
int n,mn=2e9,mx=,lt,rt=2e9,mid,ans=;
int a[N][N],l[N],b[M],id[M],tot,vis[N],cnt;
int sa[M],ta[M],rk[M],ht[M],wa[M],wb[M],ca[M],cb[M];
inline bool check(int k)
{
for(int i=;i<=tot;++i)
{
if(ht[i]<k)memset(vis,,sizeof(vis)),cnt=;
if(!vis[id[sa[i]]])vis[id[sa[i]]]=,++cnt;
if(cnt==n)return true;
}
return false;
}
signed main(void)
{
scanf("%d",&n);
for(int i=;i<=n;++i)
{
scanf("%d",l+i);
for(int j=;j<=l[i];++j)
{
scanf("%d",&a[i][j]);
if(j>)mx=max(mx,a[i][j]-a[i][j-]);
}
rt=min(rt,l[i]);
}
for(int i=;i<=n;++i)
{
for(int j=;j<=l[i];++j)b[++tot]=a[i][j]-a[i][j-],id[tot]=i;
b[++tot]=++mx;
}
for(int i=;i<=tot;++i)mn=min(mn,b[i]);
for(int i=;i<=tot;++i)b[i]=b[i]-mn+,mx=max(mx,b[i]);
memset(ca,,sizeof(ca));
for(int i=;i<=tot;++i)++ca[b[i]];
for(int i=;i<=mx;++i)ca[i]+=ca[i-];
for(int i=tot;i>=;--i)sa[ca[b[i]]--]=i;
rk[sa[]]=;
for(int i=;i<=tot;++i)rk[sa[i]]=rk[sa[i-]]+(b[sa[i]]!=b[sa[i-]]);
for(int k=;rk[sa[tot]]<tot;k<<=)
{
memset(ca,,sizeof(ca));
memset(cb,,sizeof(cb));
for(int i=;i<=tot;++i)++ca[wa[i]=rk[i]],++cb[wb[i]=i+k<=tot?rk[i+k]:];
for(int i=;i<=tot;++i)ca[i]+=ca[i-],cb[i]+=cb[i-];
for(int i=tot;i>=;--i)ta[cb[wb[i]]--]=i;
for(int i=tot;i>=;--i)sa[ca[wa[ta[i]]]--]=ta[i];
rk[sa[]]=;
for(int i=;i<=tot;++i)rk[sa[i]]=rk[sa[i-]]+(wa[sa[i]]!=wa[sa[i-]]||wb[sa[i]]!=wb[sa[i-]]);
}
for(int i=,j=;i<=tot;++i)
{
if(--j<)j=;
while(b[i+j]==b[sa[rk[i]-]+j])++j;
ht[rk[i]]=j;
}
while(lt<=rt)
{
if(check(mid=(lt+rt)>>))
ans=mid+,lt=mid+;
else rt=mid-;
}
printf("%d\n",ans);
}
2017.01.13 补加Tab
@Author: YouSiki
BZOJ 4698: Sdoi2008 Sandy的卡片的更多相关文章
- BZOJ 4698: Sdoi2008 Sandy的卡片 [后缀自动机]
4698: Sdoi2008 Sandy的卡片 题意:差分后就是多个串LCS SAM+map大法好 模板打错 智力-2 #include <iostream> #include <c ...
- 【刷题】BZOJ 4698 Sdoi2008 Sandy的卡片
Description Sandy和Sue的热衷于收集干脆面中的卡片.然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积攒卡片兑换超炫的人物模型.每一张卡片都由一些数字进行标记,第 ...
- BZOJ 4698: Sdoi2008 Sandy的卡片 后缀数组 + RMQ + 查分
题目描述 Sandy和Sue的热衷于收集干脆面中的卡片. 然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积攒卡片兑换超炫的人物模型. 每一张卡片都由一些数字进行标记,第i张卡片的 ...
- ●BZOJ 4698 Sdoi2008 Sandy的卡片
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4698 题解: 后缀数组,二分这个题还是比较套路的.首先依据题意,把各个串差分以后,用分割符号 ...
- bzoj 4698: Sdoi2008 Sandy的卡片【SAM】
差分之后用SAM求LCS,然后答案就是LCS+1 #include<iostream> #include<cstdio> #include<cstring> usi ...
- BZOJ 4698: Sdoi2008 Sandy的卡片(后缀数组+差分+二分答案)
传送门 解题思路 看到一个子串加一个数字到另一个子串,自然可以想到差分.然后要把所有串都拼起来,求出\(height\)数组后可以二分答案来做,每次二分一个答案后统计一下连续的\(height> ...
- 4698. [SDOI2008]Sandy的卡片【后缀数组】
Description Sandy和Sue的热衷于收集干脆面中的卡片.然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积 攒卡片兑换超炫的人物模型.每一张卡片都由一些数字进行标记, ...
- 4698: Sdoi2008 Sandy的卡片
前言 总之这个东西说起来很麻烦就是了, 思路 差分合并+后缀数组+二分(dddl) 类似于那个bzoj1031的复制子串和那个poj1743的差分 来看个例子 3 5 1 2 3 4 5 4 1 1 ...
- 【BZOJ4698】[SDOI2008]Sandy的卡片
[BZOJ4698][SDOI2008]Sandy的卡片 题面 flag倒了. bzoj 洛谷 题解 首先题目的区间加很丑对吧, 将每个串差分一下,就可以转化为 求: 给定\(N\)个串,求他们的最长 ...
随机推荐
- [C#6] 4-string 插值
0. 目录 C#6 新增特性目录 1. 老版本的代码 internal class Person { public string Name { get; set; } public int Age { ...
- Play Framework 完整实现一个APP(五)
程序以及基本可用了,需要继续完善页面 1.创建页面模板 创建文件 app/views/tags/display.html *{ Display a post in one of these modes ...
- SqlServer--聚合函数
--聚合函数默认把整个表中的数据当做"一组",然后才进行的统计. select * from NewPerson --统计出所有人的年龄的总和 select sum(age) as ...
- SQL SERVER 重组含有特殊字符的索引时遇到“关键字 'with' 附近有语法错误.”
案例描述 这是在索引重组过程中遇到的有意思的错误案例,搜索了一下也没有看到相关资料,估计我第一个碰到这类错误的人(It's just a joke).具体情况是YourSQLDba在做维护数据库索引时 ...
- 使用memadmin可视化监视我们的memcache
相信还是有很多项目使用memcache,可能有些人说有点out了,但是呢??? 项目上的东西不是你想换就能换的...谁都想多一事不如少 一事,大面积更换之后所面临的未知风险可能让你无法承受,但是呢, ...
- [嵌入式开发]Linux性能分析——上下文切换
一.从一个问题说起 相信很多人在玩手机还是PC时,都曾碰到过这样一种情况,安装的软件多了系统性能就变慢了,但是去查看CPU利用率一直都低于10%,内存也很充足.我在近期的开发工作中就碰到了类似的情况, ...
- IP分片重组的分析和常见碎片攻击 v0.2
IP分片重组的分析和常见碎片攻击 v0.2http://www.nsfocus.net/index.php?act=magazine&do=view&mid=584 作者:yawl ( ...
- Java 多态
多态通过分离做什么和怎么做,从另一个角度将接口和实现分离开来. 继承允许将对象视为它自己本身的类型活基类型来加以处理. 方法调用绑定 绑定: 将一个方法调用同一个方法主体关联起来. 前期绑定:在程序执 ...
- linuxx virutal machine installation
1. vmplayer download: https://my.vmware.com/web/vmware/free#desktop_end_user_computing/vmware_player ...
- Spring中常用类型的bean配置(Map,List,Set,基本类型)
给自己做个笔记... 有时会用到配置文件中配置一下映射关系,方便以后扩展.此时可采用集合类型的bean配置方式配置.程序中直接注入即可. map类型的: <!-- 旧版方式,无需util包 -- ...