传送门

很容易想到,题目中的相同是指差分数组相同。

那么可以把差分数组连起来,中间加上一个没有出现过的且字典序小的数

双指针移动,用st表维护height数组中的最小值。

当然用单调队列应该也可以且更快。

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#define N 1010000using namespace std;int n, m, t, cnt, len, ans, mx, mn = 1e9;
int pos[N], a[N / 1000], num[N / 1000], sa[N], height[N], Rank[N], b[N], x[N], y[N], d[N][22], s[N];inline int read()
{int x = 0, f = 1;char ch = getchar();for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';return x * f;
}inline void build_sa()
{int i, k, p;for(i = 0; i < m; i++) b[i] = 0;for(i = 0; i < n; i++) b[x[i] = s[i]]++;for(i = 1; i < m; i++) b[i] += b[i - 1];for(i = n - 1; i >= 0; i--) sa[--b[x[i]]] = i;for(k = 1; k <= n; k <<= 1){p = 0;for(i = n - k; i < n; i++) y[p++] = i;for(i = 0; i < n; i++) if(sa[i] >= k) y[p++] = sa[i] - k;for(i = 0; i < m; i++) b[i] = 0;for(i = 0; i < n; i++) b[x[y[i]]]++;for(i = 1; i < m; i++) b[i] += b[i - 1];for(i = n - 1; i >= 0; i--) sa[--b[x[y[i]]]] = y[i];swap(x, y);p = 1, x[sa[0]] = 0;for(i = 1; i < n; i++)x[sa[i]] = y[sa[i]] == y[sa[i - 1]] && y[sa[i] + k] == y[sa[i - 1] + k] ? p - 1 : p++;if(p >= n) break;m = p;}
}inline void build_height()
{int i, j, k = 0;for(i = 0; i < n; i++) Rank[sa[i]] = i;for(i = 0; i < n; i++){if(k) k--;j = sa[Rank[i] - 1];while(s[i + k] == s[j + k]) k++;height[Rank[i]] = k;}
}inline void build_st()
{int i, j;for(i = 1; i < n; i++) d[i][0] = height[i];for(j = 1; (1 << j) < n; j++)for(i = 1; i + (1 << j) - 1 < n; i++)d[i][j] = min(d[i][j - 1], d[i + (1 << j - 1)][j - 1]);
}inline int query(int l, int r)
{l++;if(l > r) return 0;int tmp = log2(r - l + 1);return min(d[l][tmp], d[r - (1 << tmp) + 1][tmp]);
}inline void solve()
{int i, j = 0;for(i = 0; i < n; i++){while(j < n && cnt < t){if(!num[pos[sa[j]]]++ && pos[sa[j]]) cnt++;j++;}if(cnt == t) ans = max(ans, query(i, j - 1));if(!--num[pos[sa[i]]] && pos[sa[i]]) cnt--;}
}int main()
{int i, j, k;t = read();for(i = 1; i <= t; i++){k = read();for(j = 1; j <= k; j++) a[j] = read();for(j = 1; j < k; j++){pos[n] = i;s[n++] = a[j + 1] - a[j];mn = min(mn, s[n - 1]);}s[n++] = mx++;}for(i = 0; i < n; i++)if(pos[i]) s[i] = s[i] - mn + mx, m = max(m, s[i]);m++;build_sa();build_height();build_st();solve();printf("%d\n", ans + 1);return 0;
}

  

转载于:https://www.cnblogs.com/zhenghaotian/p/8286579.html

[luoguP2463] [SDOI2008]Sandy的卡片(后缀数组 + st表)相关推荐

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

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

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

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

  3. 后缀数组 ---- 2018~2019icpc焦作H题[后缀数组+st表+二分+单调栈]

    题目链接 题目大意: 给出nnn个数,定义f[l,r]f[l,r]f[l,r]表示 区间[l,r][l,r][l,r]的最大值,求所有 子区间的最大值的和,要求相同的子区间只能算一次 比如数列 5 6 ...

  4. 【BZOJ4310】跳蚤,后缀数组+ST表求LCP+二分答案

    Time:2016.05.26 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 首先要求出不同子串的个数 有这样一个性质 一个串中不同子串的总数=∑(len-height[i]-sa ...

  5. [BZOJ4698][SDOI2008]Sandy的卡片(后缀自动机)

    差分之后就是求多串LCS. 对其中一个串建SAM,然后把其它串放在上面跑. 对SAM上的每个状态都用f[x]记录这个状态与当前串的最长匹配长度,res[x]是对每次的f[x]取最小值.答案就是res[ ...

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

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

  7. [SDOI2008]Sandy的卡片

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

  8. 4698: Sdoi2008 Sandy的卡片

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

  9. BZOJ4698: Sdoi2008 Sandy的卡片

    题解: 裸后缀数组+二分答案 /**************************************************************Problem: 4698User: c20 ...

最新文章

  1. 2022-2028年中国动力锂电池用橡胶密封件行业研究及前瞻分析报告
  2. 搭建rtx服务并客户端登录
  3. C指针原理(16)-C指针基础
  4. html中刷新按钮的代码,常见的按钮类型 点击button刷新的几种常用代码
  5. 测试Rockey 4 Smart加密锁的C语言代码
  6. 手把手教你爬虫requests实战演练——python篇
  7. 从进程组、会话、终端的概念深入理解守护进程
  8. Java Swing Mysql实现的Ktv点歌系统项目源码附带视频运行教
  9. Java单例模式之最优解分析【为何说是最优解】
  10. 变分自编码器(VAE)详解与实现(tensorflow2.x)
  11. 100套计算机毕设源码+论文 免费分享 【2020最新版】
  12. java使用Jco连接SAP
  13. 12V升压100V,12V升压200V,300V电源转换升压模块
  14. Java初级工程师的面试自我介绍模板(仅供参考)
  15. C语言alloc函数总结
  16. JS 超大文件上传解决方案:分片断点上传(一)
  17. 企业邮箱注册申请入口,公司邮箱申请哪个好?
  18. Java - JIT即时编译器
  19. python anaconda下载包_Anaconda下载 10.0.15063.0
  20. BatchNorm和LayerNorm的比较

热门文章

  1. webservice CXF入门服务端
  2. Yum本地Rpm库设置
  3. 基于zookeeper实现配置集中管理【转】
  4. cocos2d-x 3.X (二)创建动起来的精灵
  5. 选择标签至文本域效果,可多选/可过滤重复/可限制个数
  6. 利用c#开发一个telnet unix服务器或者防火墙的小工具(转)
  7. class括号里的object_JVM真香系列:轻松理解class文件到虚拟机(上)
  8. html页面关闭执行函数,html页面调用js文件里的函数报错--方法名 is not defined处理方法...
  9. (3)verilog语言编写二分频
  10. 主程序与子程序不在同一程序模块中_数控车床子程序M98、M99编程实例!