前言

总之这个东西说起来很麻烦就是了,

思路

差分合并+后缀数组+二分(dddl)

类似于那个bzoj1031的复制子串和那个poj1743的差分

来看个例子

3
5 1 2 3 4 5
4 1 1 1 2
4 1 2 3 4

变成了这个(最后一个INF最好删掉吧,应该不影响的吧)

1111 INF 001 INF 111
1. 001 INF 111 belong[2] 0
2. 01 INF 111 belong[2] 1
3. 1 belong[3] 0
4. 11 belong[3] 1
5. 111 belong[3] 2
6. 1111 INF 001 INF 111 belong[1] 3
7. 111 INF 001 INF 111 belong[1] 3
8. 11 INF 001 INF 111 belong[1] 2
9. 1 INF 001 INF 111 belong[1] 1
10. 1 INF 111 belong[2] 2
11. INF 111 belong[0] 0
12. INF 001 INF 111 belong[0] 1

很明显,答案是min[5,10]+1=1+1=2

belong是后缀i属于那一部分本串(上来给你的哪一行)

INF属于belong【0】

就是height数组包含着所以belong的最小值得最大值

很容易想到二分

可我想dddl来着,没弄出来

就直接暴力的st表+指针移动了nlogn

好像是他俩都没用

错误

写了半天dddl没写出来,吐血啦

看来dddl还是硬伤,找时间填坑

代码

#include <bits/stdc++.h>
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define ROF(i,a,b) for(int i=a;i>=b;--i)
using namespace std;
const int maxn=4e5+8;
int read() {
int x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
int nn,n,m;
int s[maxn],tmp[1401];
int len[1010];
int sa[maxn],rk[maxn],c[maxn],x[maxn];
void get_sa() {
FOR(i,1,n) ++c[rk[i]=s[i]];
FOR(i,1,m) c[i]+=c[i-1];
ROF(i,n,1) sa[c[rk[i]]--]=i;
for(int k=1;k<=n;k<<=1) {
int p=0;
FOR(i,n-k+1,n) x[++p]=i;
FOR(i,1,n) if(sa[i]>k) x[++p]=sa[i]-k;
FOR(i,1,m) c[i]=0;
FOR(i,1,n) ++c[rk[i]];
FOR(i,1,m) c[i]+=c[i-1];
ROF(i,n,1) sa[c[rk[x[i]]]--]=x[i],x[i]=0;
swap(rk,x);
rk[sa[1]]=1,p=1;
FOR(i,2,n) rk[sa[i]]=(x[sa[i]]==x[sa[i-1]]&&x[sa[i]+k]==x[sa[i-1]+k]) ? p : ++p;
if(p==n) break;
m=p;
}
}
int height[maxn],st[maxn][21];
void get_height() {
FOR(i,1,n) rk[sa[i]]=i;
int k=0;
FOR(i,1,n) {
k=k?k-1:0;
int j=sa[rk[i]-1];
while(s[i+k]==s[j+k]&&i+k<=n&&j+k<=n) k++;
height[rk[i]]=k;
}
height[0]=0;
FOR(i,1,n) st[i][0]=height[i];
FOR(j,1,20)
for(int i=1;i+(1<<j)-1<=n;++i)
st[i][j]=min(st[i][j-1],st[i+(1<<(j-1))][j-1]);
}
int LCP(int i,int j) {
int x=log2(j-i+1);
return min(st[i][x],st[j-(1<<x)+1][x]);
}
int belong[maxn],tong[maxn];
int main() {
nn=read(),m=2001;
FOR(i,1,nn) {
len[i]=read();
FOR(j,1,len[i]) tmp[j]=read();
FOR(j,1,len[i]-1) s[++n]=tmp[j+1]-tmp[j],belong[n]=i;
s[++n]=2001;
}
n--;
get_sa();
get_height();
int OU_MY_FFF=0;
int l=1,js=0;
FOR(i,1,n) {
if(tong[belong[ sa[i] ]]==0 && belong[sa[i]]) js++;
tong[belong[ sa[i] ]]++;
while(tong[belong[sa[l]]]>1&&l<=i) tong[belong[sa[l]]]--,l++;
while(belong[sa[l]]==0) l++;
if(js==nn) OU_MY_FFF=max(OU_MY_FFF,LCP(l+1,i));
}
cout<<OU_MY_FFF+1<<"\n";
return 0;
}

4698: Sdoi2008 Sandy的卡片的更多相关文章

  1. BZOJ 4698: Sdoi2008 Sandy的卡片

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

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

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

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

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

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

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

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

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

  6. ●BZOJ 4698 Sdoi2008 Sandy的卡片

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

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

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

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

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

  9. 洛谷 P2463 [SDOI2008]Sandy的卡片 解题报告

    P2463 [SDOI2008]Sandy的卡片 题意 给\(n(\le 1000)\)串,定义两个串相等为"长度相同,且一个串每个数加某个数与另一个串完全相同",求所有串的最长公 ...

随机推荐

  1. Unity shader学习之Grab Pass实现玻璃效果

    GrabPass可将当前屏幕的图像绘制在一张纹理中,可用来实现玻璃效果. 转载请注明出处:http://www.cnblogs.com/jietian331/p/7201324.html shader ...

  2. <<Natural Language Inference over Interaction Space >> 句子匹配

    模型结构 code :https://github.com/YichenGong/Densely-Interactive-Inference-Network 首先是模型图: Embedding Lay ...

  3. <script> 属性crossorigin

    今日偶然见到如下代码: <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper. ...

  4. 互联网级监控系统必备-时序数据库之Influxdb技术

    时间序列数据库,简称时序数据库,Time Series Database,一个全新的领域,最大的特点就是每个条数据都带有Time列. 时序数据库到底能用到什么业务场景,答案是:监控系统. Baidu一 ...

  5. codeoforces 932A

    题意: A和B在玩一个游戏,首先有一个X0 >= 3,之后选择一个小于X0的质数p,然后在找一个最小的X1 >= X0,并且p可以整除X1:之后再选择一个小于X1的质数p,然后再找一个最小 ...

  6. 关于poi导出excel方式HSSFWorkbook(xls).XSSFWorkbook(xlsx).SXSSFWorkbook.csv的总结

    1.HSSFWorkbook(xls) import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermo ...

  7. datetime处理日期和时间

    datetime.now() # 获取当前datetimedatetime.utcnow() datetime(2017, 5, 23, 12, 20) # 用指定日期时间创建datetime 一.将 ...

  8. MySql 存储过程 退出

    mysql不支持quit, exit或return的方式退出编写存储过程时,为了业务规则需要,我们可能需要提前退出存储过程那么,我们可以利用leave label方式模拟实现quit退出的效果应用示例 ...

  9. c# 静态方法和数据

    c#所有方法都必须在类的内部声明,但如果把方法或者字段声明为static就可以使用,类名代用方法或者访问字段. 在方法中声明一个静态变量a 和一个静态的aFun方法.下面是在主函数中调用. 从上图可以 ...

  10. RocketMQ 顺序消费只消费一次 坑

    rocketMq实现顺序消费的原理 produce在发送消息的时候,把消息发到同一个队列(queue)中,消费者注册消息监听器为MessageListenerOrderly,这样就可以保证消费端只有一 ...