4698: Sdoi2008 Sandy的卡片

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 106  Solved: 40
[Submit][Status][Discuss]

Description

Sandy和Sue的热衷于收集干脆面中的卡片。然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积攒卡片兑换超炫的人物模型。每一张卡片都由一些数字进行标记,第i张卡片的序列长度为Mi,要想兑换人物模型,首先必须要集够N张卡片,对于这N张卡片,如果他们都有一个相同的子串长度为k,则可以兑换一个等级为k的人物模型。相同的定义为:两个子串长度相同且一个串的全部元素加上一个数就会变成另一个串。Sandy的卡片数远远小于要求的N,于是Sue决定在Sandy的生日将自己的卡片送给Sandy,在Sue的帮助下,Sandy终于集够了N张卡片,但是,Sandy并不清楚他可以兑换到哪个等级的人物模型,现在,请你帮助Sandy和Sue,看看他们最高能够得到哪个等级的人物模型。

Input

第一行为一个数N,表示可以兑换人物模型最少需要的卡片数,即Sandy现在有的卡片数.
第i+1行到第i+N行每行第一个数为第i张卡片序列的长度Mi,之后j+1到j+1+Mi个数,用空格分隔,分别表示序列中.
的第j个数.
n<=1000,M<=1000,2<=Mi<=101

Output

一个数k,表示可以获得的最高等级。
 

Sample Input

2
2 1 2
3 4 5 9

Sample Output

2

HINT

Source

[Submit][Status][Discuss]

首先,对于题目中的匹配,可以转换成两个相邻数字之间差值的匹配问题。因此对于每个数字串,先前后做差得到新的数字串,然后把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的卡片的更多相关文章

  1. BZOJ 4698: Sdoi2008 Sandy的卡片 [后缀自动机]

    4698: Sdoi2008 Sandy的卡片 题意:差分后就是多个串LCS SAM+map大法好 模板打错 智力-2 #include <iostream> #include <c ...

  2. 【刷题】BZOJ 4698 Sdoi2008 Sandy的卡片

    Description Sandy和Sue的热衷于收集干脆面中的卡片.然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积攒卡片兑换超炫的人物模型.每一张卡片都由一些数字进行标记,第 ...

  3. BZOJ 4698: Sdoi2008 Sandy的卡片 后缀数组 + RMQ + 查分

    题目描述 Sandy和Sue的热衷于收集干脆面中的卡片. 然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积攒卡片兑换超炫的人物模型. 每一张卡片都由一些数字进行标记,第i张卡片的 ...

  4. ●BZOJ 4698 Sdoi2008 Sandy的卡片

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4698 题解: 后缀数组,二分这个题还是比较套路的.首先依据题意,把各个串差分以后,用分割符号 ...

  5. bzoj 4698: Sdoi2008 Sandy的卡片【SAM】

    差分之后用SAM求LCS,然后答案就是LCS+1 #include<iostream> #include<cstdio> #include<cstring> usi ...

  6. BZOJ 4698: Sdoi2008 Sandy的卡片(后缀数组+差分+二分答案)

    传送门 解题思路 看到一个子串加一个数字到另一个子串,自然可以想到差分.然后要把所有串都拼起来,求出\(height\)数组后可以二分答案来做,每次二分一个答案后统计一下连续的\(height> ...

  7. 4698. [SDOI2008]Sandy的卡片【后缀数组】

    Description Sandy和Sue的热衷于收集干脆面中的卡片.然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积 攒卡片兑换超炫的人物模型.每一张卡片都由一些数字进行标记, ...

  8. 4698: Sdoi2008 Sandy的卡片

    前言 总之这个东西说起来很麻烦就是了, 思路 差分合并+后缀数组+二分(dddl) 类似于那个bzoj1031的复制子串和那个poj1743的差分 来看个例子 3 5 1 2 3 4 5 4 1 1 ...

  9. 【BZOJ4698】[SDOI2008]Sandy的卡片

    [BZOJ4698][SDOI2008]Sandy的卡片 题面 flag倒了. bzoj 洛谷 题解 首先题目的区间加很丑对吧, 将每个串差分一下,就可以转化为 求: 给定\(N\)个串,求他们的最长 ...

随机推荐

  1. 又一个高性能轻量级的iOS模型框架YYModel

    前言 iOS的模型框架其实有很多了,去年研究过Mantle,也了解过JSONModel.MJExtension,最近的项目项目优化的时候,再次考虑,基于轻量级.高性能的考虑,最终选择了YYModel. ...

  2. UIWebView保存网页中的图片(转载)

    现在H5混合原生开发的方式越来越流行,也就要用到UIWebView控件.在开发过程中,我们可能会遇到一个需求,要求我们保存网页上的图片,当用户点击图片的时候,就可以让用户选择是否下载图片. 在系统自带 ...

  3. linux 学习随笔-shell简单编写

    脚本最好都放在/usr/local/sbin中 脚本的执行 sh -x 脚本.sh -x可以查看执行过程 1在脚本中使用变量 使用变量的时候,需要使用$符号:  #!/bin/bash  ##把命令赋 ...

  4. js自动完成

    源代码来自于: http://down.51cto.com/data/921955  我做了一下修改. 要做一个自动完成的功能,又不想依赖一大堆的js脚本库,我要的是定制的,代码尽可能简洁,方便修改和 ...

  5. #研发解决方案介绍#IdCenter(内部统一认证系统)

    郑昀 基于朱传志的设计文档 最后更新于2014/11/13 关键词:LDAP.认证.权限分配.IdCenter. 本文档适用人员:研发   曾经一个IT内部系统配一套帐号体系和授权   线上生产环境里 ...

  6. Linux 磁盘自检介绍

    在Linux系统中,有时候重启会耗费非常长的时间,如果你进一步检查细节,就会发现绝大部分时间都耗费在磁盘自检(fsck)上了,有时候遇到时间比较紧急的情况,磁盘自检耗费的时间非常长,真的是让人心焦火急 ...

  7. jQuery 3.0 的 Data 浅析

    jQuery 3.0 在6月9日正式发布了,3.0 也被称为下一代的 jQuery .这个版本从14年10月开始,其中发布过一次beta 版(2016/1/14,)和候选版(2016/05/20).一 ...

  8. redis 基础

    一 redis数据类型redis支持5种类型的数据类型,它描述如下的:1. 字符串 Redis字符串是字节序列.Redis字符串是二进制安全的,这意味着他们有一个已知的长度没有任何特殊字符终止,所以你 ...

  9. 帆软报表FineReport SQLServer数据库连接失败常见解决方案

    1. 问题描述 帆软报表FineReport客户端连接SQLServer(2000.2005等),常常会出现如下错误:com.microsoft.sqlserver.jdbc.SQLServerExc ...

  10. spark1.4.1 启动过程

    今天稍微没那么忙了,趁着这个时间,准备把spark的启动过程总结一下(),分享给大家.现在使用的spark1.4.1版本 当然前提是你已经把spark环境搭建好了. 1.我们启动spark的时候一般会 ...