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\)个串,求他们的最长 ...
随机推荐
- python爬虫—爬取百度百科数据
爬虫框架:开发平台 centos6.7 根据慕课网爬虫教程编写代码 片区百度百科url,标题,内容 分为4个模块:html_downloader.py 下载器 html_outputer.py 爬取数 ...
- MVC3.0----整理之一
1.ViewBag对象是动态解析对象 @{ ViewBag.Title = "Insert"; } 不仅可以把单个的对象绑定到 ViewBag上,还可以直接绑定List ViewB ...
- Linux命令学习总结: file命令
命令简介: 该命令用来识别文件类型,也可用来辨别一些文件的编码格式.它是通过查看文件的头部信息来获取文件类型,而不是像Windows通过扩展名来确定文件类型的. 执行权限 :All User 指令所在 ...
- shell脚本执行时报"bad interpreter: Text file busy"的解决方法
在执行一个shell脚本时,遇到了“-bash: ./killSession.sh: /bin/bash: bad interpreter: Text file busy”错误提示,如下所示: [or ...
- Ant :DataType
DataType patternset fileset selector filelist path regexp Ant datatype Ant中,除了Property可以做为Task执行时使用的 ...
- WPF中,Combox的SelectedItem属性绑定成功后,未能默认显示上一次选择的结果。
问题描述: Combox中,设定了绑定对象,但是在第一次进入时却没有显示上次选中的项. 1)查看SelectedItem对应绑定的值,也是有的(启动时,读取上次设置的结果,来初始化界面). ...
- 《java JDK7 学习笔记》之继承与多态
1.面向对象中,子类继承父类,避免重复的行为定义,不过并非为了避免重复定义行为就使用继承.应该正确判断使用继承的时机及继承之后灵活的运用多态,才是学习继承时的重点. 2.程序代码重复在程序设计上,就是 ...
- 【转】Flex 布局语法教程
网页布局(layout)是CSS的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂直居中 ...
- 看 nova-scheduler 如何选择计算节点 - 每天5分钟玩转 OpenStack(27)
本节重点介绍 nova-scheduler 的调度机制和实现方法:即解决如何选择在哪个计算节点上启动 instance 的问题. 创建 Instance 时,用户会提出资源需求,例如 CPU.内存.磁 ...
- [WPF系列]基础 Listening to Dependency Property change notifications of a given Element
I want to share this great post from Anoop that shows a easy way to add a notification system to dep ...