bzoj4698
题解:
后缀数组
对所有序列差分一下
公共串的长度+1就是答案了
二分 扫一遍height即可,..
代码:
#include <bits/stdc++.h>
using namespace std;
const int N=,M=;
int n,mn=2e9,mx=,lt,rt=2e9,mid,ans=,a[N][N],l[N],b[M],id[M];
int tot,vis[N],cnt,sa[M],ta[M],rk[M],ht[M],wa[M],wb[M],ca[M],cb[M];
int 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 ;
}
return ;
}
int main()
{
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);
}
bzoj4698的更多相关文章
- 【BZOJ4698】Sandy的卡片(后缀数组)
[BZOJ4698]Sandy的卡片(后缀数组) 题面 讨厌权限题!!! 因为我交不了... 洛谷 题面 做完差之后就是裸的最长公共子串 没了.. 数组往死里开吧... #include<ios ...
- 【BZOJ4698】Sdoi2008 Sandy的卡片 后缀数组+RMQ
[BZOJ4698]Sdoi2008 Sandy的卡片 Description Sandy和Sue的热衷于收集干脆面中的卡片.然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积攒卡 ...
- 【BZOJ4698】[SDOI2008]Sandy的卡片
[BZOJ4698][SDOI2008]Sandy的卡片 题面 flag倒了. bzoj 洛谷 题解 首先题目的区间加很丑对吧, 将每个串差分一下,就可以转化为 求: 给定\(N\)个串,求他们的最长 ...
- [bzoj4698][Sdoi2008]Sandy的卡片_后缀数组_二分/单调队列_双指针
Sandy的卡片 bzoj-4698 Sdoi-2008 题目大意:题目链接. 注释:略. 想法: 这个题跟一个Usaco的题特别像.我们把这些串差分 现在我们要求的就是公共子串且出现次数不少于$k$ ...
- LG2463/BZOJ4698 「SDOI2008」Sandy的卡片 后缀数组
问题描述 LG2463 BZOJ4698 题解 看到\(n\)个数串,一开始不太好处理,可以很容易想到把这\(n\)个数串连到一起,形成一个大串,但是每个串之间不容易处理. 经过思考,想到在每个串中间 ...
- BZOJ4698 SDOI2008Sandy的卡片(后缀自动机)
差分后即求多串LCS.先考虑两个串怎么做.对第一个串建SAM,第二个串在上面跑即可,任意时刻走到的节点表示的都是第二个串的当前前缀在第一个串中出现的最长的后缀,具体计算长度时每走一个字符长度+1,跳f ...
- 【BZOJ-4698】Sandy的卡片 后缀数组
4698: Sdoi2008 Sandy的卡片 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 140 Solved: 55[Submit][Stat ...
- BZOJ4698: Sdoi2008 Sandy的卡片
差分,枚举一个串的所有后缀,暴力在所有其他串中kmp,复杂度$O(nm^2)$. #include<cstdio> const int N=1005; const int M=105; i ...
- BZOJ4698 差分 + 二分 + SA
https://www.lydsy.com/JudgeOnline/problem.php?id=4698 题意:求N个字符串中最长的相同字串的长度,相同的定义是:两个子串长度相同且一个串的全部元素加 ...
- bzoj4698 / P2463 [SDOI2008]Sandy的卡片
P2463 [SDOI2008]Sandy的卡片 直接二分长度暴力匹配....... 跑的还挺快 (正解是后缀数组的样子) #include<iostream> #include<c ...
随机推荐
- Ubuntu 追加组,用户,设置免sudo密码输入
1,以root权限执行groupadd命令创建dev组. sudo groupadd dev 2,用adduser命令创建bpuser用户,--ingroup指定用户加入dev组. sud ...
- (转)C# 单例模式
文章1: 一.多线程不安全方式实现 public sealed class SingleInstance { private static SingleInstance inst ...
- Getting started with Processing 第七章总结
媒体 如何将文件导入 Processing 中 在 Processing 中,程序是通过应用 data 文件夹中的文件来显示的,这个文件夹可以通过菜单栏中的 Sketch>show sketch ...
- Hisat2 bowtie2比对结果解读(Hisat2 Alignment summary)
RNA-seq数据的比对结果怎么解读?网上有很多人问,这里做一个大致的总结. Hisat2和bowtie2比对后产生的Alignment summary的格式是一样的,如下: Alignment su ...
- English trip EM2-PE-1B Teacher:Patirck
PE = 演讲课 课上内容(Lesson) How are you today? 你今天怎么样? What is your name? 你的名字叫什么? What do you come from ...
- Using the G711 standard
Using the G711 standard Marc Sweetgall, 28 Jul 2006 4.74 (27 votes) 1 2 ...
- Fetch的使用; Yarn命令集; NVM的管理;VueCLi3的使用;
如果喜欢使用lower-level,使用标准的 fetch API. 好处是无需额外的加载一个外部资源.但没有被浏览器完全支持,需要使用polyfill.因此使用Axios的更多一些. 参考Axios ...
- Life Winner Bo HDU - 5754
Bo is a "Life Winner".He likes playing chessboard games with his girlfriend G. The size of ...
- CentOS6.8单用户模式下修改密码
CentOS6.8单用户模式下修改密码 1. 选择进入菜单menu界面,在开启系统出现如下界面时,按Esc键(只需按一下) 2. 然后进入到如下界面 3. 上图中红色矩形类的内容,按“a”键可以修改内 ...
- CF438D 线段树 区间求和,区间求膜,单点更新
题目链接 题目大意: 给定一个长度为n的序列,要求能够执行m次下列操作: 1.查询区间[l,r]的和 2.将区间[l,r]的每一个数%=mod 3.修改第x个数为y 操作1,3都是线段树的基本操作,线 ...