4698: Sdoi2008 Sandy的卡片

题意:差分后就是多个串LCS


SAM+map大法好

模板打错 智力-2

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <map>
  7. using namespace std;
  8. typedef long long ll;
  9. const int N=2005;
  10. inline int read(){
  11. char c=getchar();int x=0,f=1;
  12. while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
  13. while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
  14. return x*f;
  15. }
  16. namespace sam{
  17. struct meow{map<int, int> ch; int par, val;} t[N];
  18. int sz=1, last=1, root=1;
  19. void extend(int c) {
  20. int p=last, np=++sz; t[np].val=t[p].val+1;
  21. for(; p && !t[p].ch[c]; p=t[p].par) t[p].ch[c]=np;
  22. if(!p) t[np].par = root;
  23. else {
  24. int q = t[p].ch[c];
  25. if(t[q].val == t[p].val+1) t[np].par = q;
  26. else {
  27. int nq = ++sz; t[nq]=t[q]; t[nq].val=t[p].val+1;
  28. t[q].par = t[np].par = nq;
  29. for(; p && t[p].ch[c]==q; p=t[p].par) t[p].ch[c] = nq;
  30. }
  31. }
  32. last=np;
  33. }
  34. int c[N], a[N], ans[N];
  35. void RadixSort() {
  36. for(int i=0; i<=sz; i++) c[i]=0;
  37. for(int i=1; i<=sz; i++) c[t[i].val]++;
  38. for(int i=1; i<=sz; i++) c[i] += c[i-1];
  39. for(int i=sz; i>=1; i--) a[ c[t[i].val]-- ]=i;
  40. for(int i=1; i<=sz; i++) ans[i] = t[i].val;
  41. }
  42. int f[N]; // max lenth
  43. void solve(int *s, int n) { //puts("\n solve");
  44. int u=root, now=0;
  45. for(int i=1; i<=n; i++) {
  46. int c = s[i]; //printf("i %d %d\n",i,c);
  47. if(t[u].ch.count(c)) u=t[u].ch[c], f[u] = max(f[u], ++now);
  48. else {
  49. while(u && !t[u].ch.count(c)) u=t[u].par;
  50. if(!u) u=root, now=0;
  51. else now=t[u].val, u=t[u].ch[c], f[u] = max(f[u], ++now);
  52. }
  53. }
  54. for(int i=sz; i>=1; i--) {
  55. int u=a[i]; ans[u] = min(ans[u], f[u]); //printf("f %d %d\n",u,f[u]);
  56. if(f[u] && t[u].par) f[t[u].par] = t[t[u].par].val;
  57. f[u]=0;
  58. }
  59. }
  60. }
  61. int n, len, s[N], last, x;
  62. int main() {
  63. freopen("in","r",stdin);
  64. n=read();
  65. len=read(); last=read();
  66. for(int i=1; i<len; i++) x=read(), s[i]=x-last, last=x;
  67. len--;
  68. for(int i=1; i<=len; i++) sam::extend(s[i]);
  69. sam::RadixSort();
  70. for(int i=2; i<=n; i++) {
  71. len=read(); last=read();
  72. for(int i=1; i<len; i++) x=read(), s[i]=x-last, last=x;
  73. len--;
  74. sam::solve(s, len);
  75. }
  76. int ans=0;
  77. for(int i=2; i<=sam::sz; i++) ans = max(ans, sam::ans[i]);
  78. printf("%d", ans+1);
  79. }

BZOJ 4698: Sdoi2008 Sandy的卡片 [后缀自动机]的更多相关文章

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

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

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

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

  3. BZOJ 4698: Sdoi2008 Sandy的卡片

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

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

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

  5. ●BZOJ 4698 Sdoi2008 Sandy的卡片

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

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

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

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

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

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

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

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

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

随机推荐

  1. UVa 725 简单枚举+整数转换为字符串

    Division  Write a program that finds and displays all pairs of 5-digit numbers that between them use ...

  2. UE4 保存为bitmap

    TArray<FColor> colorData;    colorData.Init(FColor(0, 0, 255, 255), 1920 * 1080);    for (int ...

  3. Spark算子--countByKey

    转载请标明出处http://www.cnblogs.com/haozhengfei/p/1633ffc63e2c925e930adadc9528c830.html  countByKey--Actio ...

  4. 怎么使用linux命令重启服务器

    一下的命令都可以重启Linux服务器: 1.shutdown -r now 2.reboot 3.startx

  5. thinkphp操作完提示信息该怎么弄成弹出层啊?

    http://www.thinkphp.cn/topic/21929.html 浏览:11879 发布日期:2014/08/22 分类:求助交流 关键字: thinkphp success跳转 弹出层 ...

  6. Css雪碧图

    Css雪碧图: CSS雪碧 即CSS Sprite,也有人叫它CSS精灵,是一种CSS图像合并技术,该方法是将小图标和背景图像合并到一张图片上,然后利用css的背景定位来显示需要显示的图片部分. 原理 ...

  7. hive(II)--sql考查的高频问题

    在了解别人hive能力水平的时候,不管是别人问我还是我了解别人,有一些都是必然会问的东西.问的问题也大都大同小异.这里总结一下我遇到的那些hive方面面试可能涉及的问题 1.行转列(列转行) 当我们建 ...

  8. Linux系统shell编程自学_第一章基础

    第一章 基础shell的优势在于处理操作系统底层的业务,Python,php的优势在于开发运维工具,web界面的管理工具以及web业务开发.处理一键安装.优化.报警脚本shell又叫命令解释器,它能识 ...

  9. HierarchyID 数据类型用法

    树形层次结构(Hierarchy)经常出现在有结构的数据中,T-SQL新增数据类型HierarchyID, 其长度可变,用于存储层次结构中的路径.HierarchyID表示的层次结构是树形的,由应用程 ...

  10. MySQL 水平拆分(读书笔记整理)

    转:http://blog.csdn.net/mchdba/article/details/46278687 1,水平拆分的介绍 一般来说,简单的水平切分主要是将某个访问极其平凡的表再按照某个字段的某 ...