题意

题目链接

Sol

不要问我为什么发两篇blog,就是为了骗访问量

后缀数组的也比较好想,先把所有位置差分,然后在height数组中二分就行了

数据好水啊

  1. // luogu-judger-enable-o2
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. const int MAXN = 2e6 + 10;
  5. const int INF = 2333;
  6. inline int read() {
  7. char c = getchar(); int x = 0, f = 1;
  8. while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
  9. while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
  10. return x * f;
  11. }
  12. int T, N, M, a[MAXN], id[MAXN], rak[MAXN], tp[MAXN], tax[MAXN], H[MAXN], vis[MAXN], sa[MAXN], ti, mx;
  13. void Qsort() {
  14. for(int i = 0; i <= M; i++) tax[i] = 0;
  15. for(int i = 1; i <= N; i++) tax[rak[i]]++;
  16. for(int i = 1; i <= M; i++) tax[i] += tax[i - 1];
  17. for(int i = N; i >= 1; i--) sa[tax[rak[tp[i]]]--] = tp[i];
  18. }
  19. void SuffixSort() {
  20. for(int i = 1; i <= N; i++) rak[i] = a[i], tp[i] = i;
  21. M = N + INF; Qsort();
  22. for(int w = 1, p = 0; p < N; w <<= 1, M = p) { p = 0;
  23. for(int i = 1; i <= w; i++) tp[++p] = N - i + 1;
  24. for(int i = 1; i <= N; i++) if(sa[i] > w) tp[++p] = sa[i] - w;
  25. Qsort(); swap(rak, tp); rak[sa[1]] = p = 1;
  26. for(int i = 2; i <= N; i++) rak[sa[i]] = (tp[sa[i]] == tp[sa[i - 1]] && tp[sa[i] + w] == tp[sa[i - 1] + w]) ? p : ++p;
  27. }
  28. for(int i = 1, k = 0; i <= N; i++) {
  29. if(k) k--; int j = sa[rak[i] - 1];
  30. while(a[i + k] == a[j + k]) k++;
  31. H[rak[i]] = k;
  32. }
  33. }
  34. bool check(int len) {
  35. ti++; int now = 0;
  36. for(int i = 1; i <= N; i++) {
  37. if(H[i] < len) {now = 0, ti++; continue;}
  38. if(vis[id[sa[i]]] != ti) vis[id[sa[i]]] = ti, now++;
  39. if(now == T) return 1;
  40. }
  41. return 0;
  42. }
  43. int main() {
  44. //freopen("a.in", "r", stdin);
  45. T = read();
  46. for(int i = 1; i <= T; i++) {
  47. int num = read() - 1, pre = read(); a[++N] = i; id[N] = i; mx = max(mx, num + 1);
  48. while(num--) a[++N] = read() - pre + INF, pre = a[N] + pre - INF, id[N] = i;
  49. }
  50. SuffixSort();
  51. int l = 1, r = mx, ans = 0;
  52. while(l <= r) {
  53. int mid = l + r >> 1;
  54. if(check(mid)) ans = mid, l = mid + 1;
  55. else r = mid - 1;
  56. }
  57. printf("%d", ans + 1);
  58. return 0;
  59. }

BZOJ4698: Sdoi2008 Sandy的卡片(后缀数组 二分)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. linux源码中的核心数据结构

    寄存器 pt_regs 进程线程 struct task_struct: 进程,或者是线程数据结构,在include/linux/sched.h里面定义的,与硬件体系结构无关 struct threa ...

  2. iOS 音频/视频 学习目录

    参考 iOS原生API  音/视频录制 编辑 https://www.cnblogs.com/kenshincui/p/4186022.html#summary iOS视频编解码常用库比较 http: ...

  3. docker-compose部署mysql配置

    docker-compose部署mysql配置文件如下 version: ' services: mysql: image: mysql environment: - MYSQL_ROOT_PASSW ...

  4. netsh命令操作ipsec

    IPsec就是IP安全筛选,本可以在本地安全策略中的窗口上进行操作添加,那么netsh也可以支持命令行操作这部分的内容. 我们的示例是禁止IP地址为192.168.1.10访问财务部某机3389端口 ...

  5. 阿里云redisA迁移redisB迁移

    ./redis-port restore --input=./xxx.rdb --target=r-2zedc7c8e0557dsf4.redis.rds.aliyuncs.com:6379 --au ...

  6. lua热重载

    热重载,就是不重新开unity让代码的变化直接看出来,一般在开发时候使用 lua中通过require导入的文件,最终都存在package.loaded这个table中.require会判断是否文件已经 ...

  7. 使用Chrome console提取页面数据

    使用Chrome console提取页面数据 1.需求介绍 在做课题研究的过程中,遇到这样一个问题,有一个页面中包含很多IP地址,需要把这些IP地址提取出来保存到文件中.如下图所示: 一开始的做法是一 ...

  8. js中的特殊符号含义

    一. !! js中的!! var o ={flag:4}; var test = !!o.flag; console.log(test);  // true 二.~~,<< (~~(Mat ...

  9. Expression Blend实例中文教程(3) - 布局控件快速入门Grid

    上一篇对Blend 3开发界面进行了快速入门介绍,本篇将基于Blend 3介绍Silverlight控件.对于微软开发工具熟悉的朋友,相信您很快就熟悉Blend的开发界面和控件. XAML概述 Sil ...

  10. 生成自签名证书-开启https

    1.生成CA证书 # 生成 CA 私钥 openssl genrsa -out ca.key 2048 # X.509 Certificate Signing Request (CSR) Manage ...