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
 
emmmm一道非常难受的后缀数组
一共三步但只想到了前两步(最弱智的一步没有想出来……)
首先把相邻数的所有差值连起来做一个SA ,设不同卡片为不同颜色
然后二分长度,看有没有一个SA区间公共前缀大于该长度并且涵盖所有颜色即为满足
求公共前缀的时候若该后缀的前缀跨越两个颜色是不合法的(在这里被坑了)
 
 #include<iostream>
#include<cstring>
#include<cstdio>
#define MAXN (1000000+10)
using namespace std;
int n,m=,t,h,maxn;
int r[MAXN],a[MAXN],Col[MAXN];
int SA[MAXN],Rank[MAXN],Height[MAXN];
int wt[MAXN],wa[MAXN],wb[MAXN];
int stack[MAXN],top;
bool used[MAXN]; bool cmp(int *y,int a,int b,int k)
{
int arank1=y[a];
int brank1=y[b];
int arank2=a+k>=n?-:y[a+k];
int brank2=b+k>=n?-:y[b+k];
return arank1==brank1 && arank2==brank2;
} void Build_SA()
{
int *x=wa,*y=wb;
for (int i=;i<m;++i) wt[i]=;
for (int i=;i<n;++i) wt[x[i]=r[i]]++;
for (int i=;i<m;++i) wt[i]+=wt[i-];
for (int i=n-;i>=;--i) SA[--wt[x[i]]]=i; for (int j=;j<=n;j<<=)
{
int p=;
for (int i=n-j;i<n;++i) y[p++]=i;
for (int i=;i<n;++i) if (SA[i]>=j) y[p++]=SA[i]-j; for (int i=;i<m;++i) wt[i]=;
for (int i=;i<n;++i) wt[x[y[i]]]++;
for (int i=;i<m;++i) wt[i]+=wt[i-];
for (int i=n-;i>=;--i) SA[--wt[x[y[i]]]]=y[i]; m=;swap(x,y);
x[SA[]]=;
for (int i=;i<n;++i)
x[SA[i]]=cmp(y,SA[i],SA[i-],j)?m-:m++;
if (m>=n) break;
}
} void Build_Height()
{
for (int i=;i<n;++i) Rank[SA[i]]=i;
int k=;
Height[]=;
for (int i=;i<n;++i)
{
if (!Rank[i]) continue;
int j=SA[Rank[i]-];
if (k) k--;
while (r[i+k]==r[j+k]) k++;
Height[Rank[i]]=k;
}
} bool check(int len)
{
int sum=;
for (int i=;i<n;++i)
{
if (Height[i]<len)
{
sum=;
while (top)
used[stack[top--]]=false;
}
if (!used[Col[SA[i]]] && Col[SA[i]]==Col[SA[i]+len-])
{
used[Col[SA[i]]]=true;
sum++;
stack[++top]=Col[SA[i]];
}
if (sum==t) return true;
}
return false;
} int main()
{
scanf("%d",&t);
for (int i=;i<=t;++i)
{
scanf("%d",&h);
maxn=max(maxn,h);
for (int j=;j<=h;++j)
{
scanf("%d",&a[j]);
if (j==) continue;
r[n++]=a[j]-a[j-]+;
Col[n-]=i;
}
}
Build_SA();
Build_Height();
int l=,r=;
while (l<r)
{
int mid=(l+r+)>>;
if (check(mid))
l=mid;
else
r=mid-;
}
printf("%d",l+);
}

4698. [SDOI2008]Sandy的卡片【后缀数组】的更多相关文章

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

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

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

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

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

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

  4. 【BZOJ4698】Sdoi2008 Sandy的卡片 后缀数组+RMQ

    [BZOJ4698]Sdoi2008 Sandy的卡片 Description Sandy和Sue的热衷于收集干脆面中的卡片.然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积攒卡 ...

  5. 【bzoj4698】[Sdoi2008] Sandy的卡片 后缀数组

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

  6. SDOI2008 Sandy的卡片( 后缀数组 )

    求出后缀数组, 然后二分答案, 对height数组分组检验答案. 时间复杂度O(|S| log|S|) ------------------------------------------------ ...

  7. BZOJ4698: Sdoi2008 Sandy的卡片(后缀数组 二分)

    题意 题目链接 Sol 不要问我为什么发两篇blog,就是为了骗访问量 后缀数组的也比较好想,先把所有位置差分,然后在height数组中二分就行了 数据好水啊 // luogu-judger-enab ...

  8. 洛谷P2463 [SDOI2008]Sandy的卡片(后缀数组SA + 差分 + 二分答案)

    题目链接:https://www.luogu.org/problem/P2463 [题意] 求出N个串中都出现的相同子串的最长长度,相同子串的定义如题:所有元素加上一个数变成另一个,则这两个串相同,可 ...

  9. 【BZOJ-4698】Sandy的卡片 后缀数组

    4698: Sdoi2008 Sandy的卡片 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 140  Solved: 55[Submit][Stat ...

  10. BZOJ 4698: Sdoi2008 Sandy的卡片

    4698: Sdoi2008 Sandy的卡片 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 106  Solved: 40[Submit][Stat ...

随机推荐

  1. [选译]MySQL5.7以上Zip版官方安装文档

    前言 在windows上安装Zip版MySQL(选译) 学习mysql的朋友们会发现5.7+版本的mysql变得比以前难安装了许多(当然我们可以选择installer版本,但是这样总感觉对学习mysq ...

  2. VS2013平台安装Qt插件过程

    1.下载所需安装包: Qt5.3.Qt插件下载地址:http://qt-project.org/downloads. qt-vs-addin-1.1.11-opensource.exe 下载地址:ht ...

  3. 关于JqueryCheck选中获取数据

    关于Jquery获取Check选中数据 首先还是得引用Jquery的包,然后新增3个CheckBox <div> <input type="checkbox" n ...

  4. js-NodeList对象和HTMLCollection对象

    getElementsByName()和getElementsByTagName()都返回NodeList对象,而类似document.images和document.forms的属性为HTMLCol ...

  5. DOM增删改操作

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  6. python代码打包发布

    背景 本文介绍了python中一种最简单的代码结构的打包方式 包名称 我们先给我们的包取个名字,python包起名需要符合下面的规范 全部小写 在pypi上是唯一的 下划线分隔或没有单词分隔符(不要使 ...

  7. Android SimpleAdapter的参数

    1.作用是ArrayList和 ListView的桥梁.这个ArrayList里边的每一项都是一个Map<String,?>类型.       ArrayList当中的每一项 Map对象都 ...

  8. 五种常用web服务器jvm参数设置

     一.tomcat Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,需要调大.有以下几种方法可以选用:第一种方法:在配置文件中设置Windows下,在文件/bi ...

  9. window 命令行

    清屏 cls 启动服务 net start 服务名(nexus.mysql) 关闭服务 net stop 服务名(nexus.mysql) 删除服务 sc delete 服务名 如果服务名有空格,加引 ...

  10. this and super

    this 和 super 的区别:this, 先从本类找属性和方法,本类找不到再从父类找.super, 从父类找. this 和 super 都可以调用构造方法,所以this() 和 super() ...