P2463 [SDOI2008]Sandy的卡片[差分+串拼接后缀数组]
P2463 [SDOI2008]Sandy的卡片
套路都差不多,都是差分后二分答案找lcp。只是这题要把多个串拼接起来成为一个大串,中间用某些值域中没有的数字相隔(最好间隔符都不一样想想为什么),排序后在二分答案,开个栈统计即可(保证单次check复杂度O(N))。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=+;//m<=101不是m<=100大小没算好坑死我了
template<typename T>inline char MAX(T&A,T B){return A<B?(A=B,):;}
template<typename T>inline char MIN(T&A,T B){return A>B?(A=B,):;}
inline int read(){
int f=,x=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
while(isdigit(c))x=(x<<)+(x<<)+(c^),c=getchar();return f?-x:x;
}
int a[N],pos[N],bin[N],vis[N],tot;
int n,l,x,ans,tmp,mid,L,R=; int sa[N],h[N],cnt[N],y[N],rk[N],p,m;
inline void suffix_sort(){m=;
for(register int i=;i<=tot;++i)++cnt[rk[i]=a[i]];
for(register int i=;i<=m;++i)cnt[i]+=cnt[i-];
for(register int i=tot;i;--i)sa[cnt[rk[i]]--]=i;
for(register int k=;k<tot;k<<=,p=){
for(register int i=tot-k+;i<=tot;++i)y[++p]=i;
for(register int i=;i<=tot;++i)if(sa[i]>k)y[++p]=sa[i]-k;
for(register int i=;i<=m;++i)cnt[i]=;
for(register int i=;i<=tot;++i)++cnt[rk[y[i]]];
for(register int i=;i<=m;++i)cnt[i]+=cnt[i-];
for(register int i=tot;i;--i)sa[cnt[rk[y[i]]]--]=y[i];
swap(rk,y);rk[sa[]]=p=;
for(register int i=;i<=tot;++i)rk[sa[i]]=y[sa[i]]==y[sa[i-]]&&y[sa[i]+k]==y[sa[i-]+k]?p:++p;
if(p==tot)break;m=p;
}p=;
for(register int i=;i<=tot;h[rk[i]]=p,p?--p:,++i)while(a[i+p]==a[sa[rk[i]-]+p]&&++p);
} inline int check(int k){
for(register int i=;a[sa[i]]<=;++i){
if(h[i]<k){while(x)vis[bin[x--]]=;}
if(!vis[pos[sa[i]]])vis[pos[sa[i]]]=,bin[++x]=pos[sa[i]];
if(x==n)return ;
}
return ;
} int main(){//freopen("tmp.in","r",stdin);
n=read();
for(register int i=;i<=n;++i){
l=read();a[++tot]=read();pos[tot]=i;
for(register int j=;j<=l;++j)a[++tot]=read(),a[tot-]=a[tot]-a[tot-]+,pos[tot]=i;
a[tot]=i+;
}
suffix_sort();
while(L<=R){
mid=L+R>>;
if(check(mid))ans=mid,L=mid+;
else R=mid-;
}
printf("%d\n",ans+);
return ;
}
P2463 [SDOI2008]Sandy的卡片[差分+串拼接后缀数组]的更多相关文章
- 洛谷 P2463 [SDOI2008]Sandy的卡片 解题报告
P2463 [SDOI2008]Sandy的卡片 题意 给\(n(\le 1000)\)串,定义两个串相等为"长度相同,且一个串每个数加某个数与另一个串完全相同",求所有串的最长公 ...
- bzoj4698 / P2463 [SDOI2008]Sandy的卡片
P2463 [SDOI2008]Sandy的卡片 直接二分长度暴力匹配....... 跑的还挺快 (正解是后缀数组的样子) #include<iostream> #include<c ...
- Luogu P2463 [SDOI2008]Sandy的卡片
题目链接 \(Click\) \(Here\) 真的好麻烦啊..事实证明,理解是理解,一定要认认真真把板子打牢,不然调锅的时候真的会很痛苦..(最好是八分钟能无脑把\(SA\)码对的程度\(QAQ\) ...
- 洛谷P2463 [SDOI2008]Sandy的卡片(后缀数组SA + 差分 + 二分答案)
题目链接:https://www.luogu.org/problem/P2463 [题意] 求出N个串中都出现的相同子串的最长长度,相同子串的定义如题:所有元素加上一个数变成另一个,则这两个串相同,可 ...
- P2463 [SDOI2008]Sandy的卡片
写一种\(O(nm)\)的做法,也就是\(O(\sum 串长)\)的. 先通过差分转化,把每个数变成这个数与上一个数的差,第一个数去掉,答案就是最长公共子串+1 按照套路把所有串拼起来,中间加一个分隔 ...
- [洛谷P2463][SDOI2008]Sandy的卡片
题目大意:有$n$个字符串,求这$n$个字符串中最长的相似公共字串,相似的定义是加上一个数后相同 题解:差分,建广义后缀自动机,然后求出每个点在多少个字符串中出现过,若在$n$个中都出现,就更新答案 ...
- 洛咕 P2463 [SDOI2008]Sandy的卡片
哈希水过. 首先这是一段delta相同的序列,按照套路差分一下,b[i]=a[i]-a[i-1],然后就是这些序列的最长公共子段 由于数据范围很小,就可以二分,枚举第一个序列的子段然后每个子序列暴力c ...
- BZOJ 4698: Sdoi2008 Sandy的卡片 [后缀自动机]
4698: Sdoi2008 Sandy的卡片 题意:差分后就是多个串LCS SAM+map大法好 模板打错 智力-2 #include <iostream> #include <c ...
- 【BZOJ4698】[SDOI2008]Sandy的卡片
[BZOJ4698][SDOI2008]Sandy的卡片 题面 flag倒了. bzoj 洛谷 题解 首先题目的区间加很丑对吧, 将每个串差分一下,就可以转化为 求: 给定\(N\)个串,求他们的最长 ...
随机推荐
- 笔记本WIFI卡简介
1.Intel AC9560(CNVI) AC9260(pcie) 3165D2W(pcie) 2.Realtek瑞昱 RTL8822be(pcie) RTL8723BU(USB) 英特尔在300系主 ...
- Excel工作表忘记密码如何破解?
第一种方法就是按住快捷键ALT+F11,然后切换出VBA编辑窗口,如图一:在该窗口的左侧我们的选择那个忘记密码的工作表,比如sheet 1... 2 然后我们复制以下代码 “Sub Pojie()Ac ...
- Xenomai for Debian Jessie
安装内核源码包 apt install linux-source-3.16 安装其他编译需要的工具: apt install build-essential libc-dev libc6-dev pk ...
- 模式识别开发之项目---基于opencv的手势识别
我使用OpenCV2.4.4的windows版本+Qt4.8.3+VS2010的编译器做了一个手势识别的小程序. 本程序主要使到了Opencv的特征训练库和最基本的图像处理的知识,包括肤色检测等等. ...
- Redis源代码分析(十七)--- multi事务操作
redis作为一非关系型数据库,居然相同拥有与RDBMS的事务操作,不免让我认为比較吃惊.在redis就专门有文件就是运行事务的相关操作的.也能够让我们领略一下.在Redis的代码中是怎样实现事务操作 ...
- 【转】Android7.0版本以上的手机Eclipse无法打出LogCat
本来想用Eclipse连下手机看下log的,结果LogCat没打出来任何信息,起初怀疑是我的DDMS有问题,结果连了下我老大的手机,完美打出log,看了下Android系统,老大的是6.0的,我的7. ...
- oc中 中文到拼音的转换
偶然发现的一个好玩的功能
- MySQL 创建自定义函数(2)
说明:下面创建一个函数,调用自定义函数返回一个返回一个随机数. (1) 创建自定义函数
- python 基础 2.8 python练习题
python 练习题: #/usr/bin/python #coding=utf-8 #@Time :2017/10/26 9:38 #@Auther :liuzhenchuan #@File ...
- String代码示例
package lianxi; public class lianxi0112 { public static void main(String[] args) { // TODO 自动生成的方法存根 ...