【BZOJ4698】Sandy的卡片(后缀数组)

题面

讨厌权限题!!!

因为我交不了。。。

洛谷

题面

做完差之后就是裸的最长公共子串

没了。。

数组往死里开吧。。。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<set>
  8. #include<map>
  9. #include<vector>
  10. #include<queue>
  11. using namespace std;
  12. #define ll long long
  13. #define MAX 2000000
  14. inline int read()
  15. {
  16. int x=0,t=1;char ch=getchar();
  17. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  18. if(ch=='-')t=-1,ch=getchar();
  19. while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
  20. return x*t;
  21. }
  22. int SA[MAX],x[MAX],y[MAX],t[MAX];
  23. int height[MAX],rk[MAX],a[MAX];
  24. int n,m,T,b[MAX],vis[MAX];
  25. char ch[MAX];
  26. int vv[MAX],tot;
  27. bool cmp(int i,int j,int k){return y[i]==y[j]&&y[i+k]==y[j+k];}
  28. void GetSA()
  29. {
  30. int m=1000000;
  31. for(int i=1;i<=n;++i)t[x[i]=a[i]]++;
  32. for(int i=1;i<=m;++i)t[i]+=t[i-1];
  33. for(int i=n;i>=1;--i)SA[t[x[i]]--]=i;
  34. for(int k=1;k<=n;k<<=1)
  35. {
  36. int p=0;
  37. for(int i=n-k+1;i<=n;++i)y[++p]=i;
  38. for(int i=1;i<=n;++i)if(SA[i]>k)y[++p]=SA[i]-k;
  39. for(int i=0;i<=m;++i)t[i]=0;
  40. for(int i=1;i<=n;++i)t[x[y[i]]]++;
  41. for(int i=1;i<=m;++i)t[i]+=t[i-1];
  42. for(int i=n;i>=1;--i)SA[t[x[y[i]]]--]=y[i];
  43. swap(x,y);
  44. x[SA[1]]=p=1;
  45. for(int i=2;i<=n;++i)
  46. x[SA[i]]=cmp(SA[i],SA[i-1],k)?p:++p;
  47. if(p>=n)break;
  48. m=p;
  49. }
  50. for(int i=1;i<=n;++i)rk[SA[i]]=i;
  51. for(int i=1,j=0;i<=n;++i)
  52. {
  53. if(j)--j;
  54. while(a[i+j]==a[SA[rk[i]-1]+j])++j;
  55. height[rk[i]]=j;
  56. }
  57. }
  58. bool check(int K)
  59. {
  60. ++tot;int cnt=0;
  61. for(int i=1;i<=n;++i)
  62. {
  63. if(height[i]<K)++tot,cnt=0;
  64. else
  65. {
  66. if(vv[vis[SA[i]]]!=tot)
  67. vv[vis[SA[i]]]=tot,++cnt;
  68. if(vv[vis[SA[i-1]]]!=tot)
  69. vv[vis[SA[i-1]]]=tot,++cnt;
  70. if(cnt==T)return true;
  71. }
  72. }
  73. return false;
  74. }
  75. int main()
  76. {
  77. T=read();
  78. for(int i=1;i<=T;++i)
  79. {
  80. int l1=read();
  81. for(int j=1;j<=l1;++j)
  82. b[j]=read();
  83. for(int j=1;j<=l1;++j)
  84. b[j]=b[j+1]-b[j]+50000;
  85. for(int j=1;j<=l1;++j)
  86. ++n,vis[n]=i,a[n]=b[j];
  87. a[++n]=i+500000;
  88. }
  89. GetSA();
  90. int l=0,r=n,ans=0;
  91. while(l<=r)
  92. {
  93. int mid=(l+r)>>1;
  94. if(check(mid))ans=mid,l=mid+1;
  95. else r=mid-1;
  96. }
  97. printf("%d\n",ans+1);
  98. return 0;
  99. }

【BZOJ4698】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. LG2463/BZOJ4698 「SDOI2008」Sandy的卡片 后缀数组

    问题描述 LG2463 BZOJ4698 题解 看到\(n\)个数串,一开始不太好处理,可以很容易想到把这\(n\)个数串连到一起,形成一个大串,但是每个串之间不容易处理. 经过思考,想到在每个串中间 ...

  5. BZOJ4698: Sdoi2008 Sandy的卡片(后缀数组 二分)

    题意 题目链接 Sol 不要问我为什么发两篇blog,就是为了骗访问量 后缀数组的也比较好想,先把所有位置差分,然后在height数组中二分就行了 数据好水啊 // luogu-judger-enab ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. vue 使用Jade模板写html,stylus写css

    vue 使用Jade模板写html,stylus写css 日常工作都是使用vue开发页面和webApp,写的多了就想偷懒简化各种书写方式,所以使用了jade写html,stylus写css,省了很多的 ...

  2. Angular4---部署---Angular 与 Nginx的邂逅

    Nginx + Angular结合操作 1.下载Nginx , 根据自己的版本下载Nginx,关于Nginx配置,请看https://www.cnblogs.com/MBirds/p/6605366. ...

  3. Thrift入门

    简介 Thrift最初由Facebook研发,主要用于各个服务之间的RPC通信,支持跨语言,常用的语言比如C++, Java, Python, PHP, Ruby, Erlang, Perl, Has ...

  4. 我的2017年终总结(PF项目框架设计心得分享 1.0rc new)

    一晃眼又过去了一年,在这一年里尽管有许多不如意的事,却阻挡不了我前进的脚步.先用一句话来总结去年一年的状态,那就是“无休无止的忙碌”.而这样的忙碌状态对我来说是不可取的,因为匮乏的忙碌只能让头脑处于一 ...

  5. java 流输出的一些问题

    一.java流的控制首先要先准备一个文件,例如:File f = new File(d:/lol.txt); 二.可以使用如下指令创建流,用于不同的用途 1.FileInputStream,FileO ...

  6. 韩信点兵(hanxin)

    相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排.五人一排.七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了.输入包含多组数据,每组数据包含3个非负整数a,b,c,表 ...

  7. OSI网络模型

    OSI中的层 功能 TCP/IP协议族 应用层         文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 表示层         数 ...

  8. 项目中AppDelegate详解

    1.AppDelegate.h //模板默认引入程序需要使用“类”的框架,即UIKit.h头文件,使它包含在程序中 #import <UIKit/UIKit.h> //此处@class声明 ...

  9. PAT1119. Pre- and Post-order Traversals

    思路:中序遍历–根结点,左子树,右子树:后序遍历–左子树,右子树,根结点. 那么在找到根结点之后就可以开始划分左右子树了.左子树的先序第一个节点是根,左子树的后序最后一个节点是根. 例如 1 2 3 ...

  10. TCP/IP三次握手四次挥手

    本文通过图来梳理TCP-IP协议相关知识.TCP通信过程包括三个步骤:建立TCP连接通道,传输数据,断开TCP连接通道.如图所示,给出了TCP通信过程的示意图. TCP 三次握手四次挥手 主要包括三部 ...