传送门

解题思路

  看到一个子串加一个数字到另一个子串,自然可以想到差分。然后要把所有串都拼起来,求出\(height\)数组后可以二分答案来做,每次二分一个答案后统计一下连续的\(height>=\)二分出答案的段是否将每个串都涵盖。

代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<algorithm>
  6. using namespace std;
  7. const int MAXN = 210005;
  8. inline int rd(){
  9. int x=0,f=1;char ch=getchar();
  10. while(!isdigit(ch)) f=ch=='-'?0:1,ch=getchar();
  11. while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
  12. return f?x:-x;
  13. }
  14. inline int min(int x,int y){
  15. return x<y?x:y;
  16. }
  17. inline int max(int x,int y){
  18. return x>y?x:y;
  19. }
  20. int n,Mi[1005],ans,num,tot,m,cnt,stk[MAXN],top;
  21. int sa[MAXN],x[MAXN<<1],y[MAXN<<1],c[MAXN],vis[MAXN];
  22. int rk[MAXN],height[MAXN],a[MAXN];
  23. bool ok[MAXN];
  24. void get_SA(){
  25. for(int i=1;i<=tot;i++) x[i]=a[i],c[x[i]]++;
  26. for(int i=2;i<=m;i++) c[i]+=c[i-1];
  27. for(int i=tot;i;i--) sa[c[x[i]]--]=i;
  28. for(int k=1;k<=tot;k<<=1){num=0;
  29. for(int i=tot-k+1;i<=tot;i++) y[++num]=i;
  30. for(int i=1;i<=tot;i++) if(sa[i]>k) y[++num]=sa[i]-k;
  31. memset(c,0,sizeof(c));
  32. for(int i=1;i<=tot;i++) c[x[i]]++;
  33. for(int i=2;i<=m;i++) c[i]+=c[i-1];
  34. for(int i=tot;i;i--) sa[c[x[y[i]]]--]=y[i],y[i]=0;
  35. swap(x,y);num=1;x[sa[1]]=1;
  36. for(int i=2;i<=tot;i++)
  37. x[sa[i]]=(y[sa[i]]==y[sa[i-1]] && y[sa[i]+k]==y[sa[i-1]+k])?num:++num;
  38. m=num;if(m==tot) break;
  39. }
  40. }
  41. void get_height(){
  42. for(int i=1;i<=tot;i++) rk[sa[i]]=i;int k=0,j;
  43. for(int i=1;i<=tot;i++){
  44. if(rk[i]==1) continue;
  45. if(k) k--;j=sa[rk[i]-1];
  46. while(i+k<=tot && j+k<=tot && a[i+k]==a[j+k]) k++;
  47. height[rk[i]]=k;
  48. }
  49. }
  50. inline bool check(int lim){
  51. while(top) ok[stk[top--]]=0;cnt=0;
  52. for(int i=1;i<=tot;i++){
  53. if(height[i]<lim) {while(top) ok[stk[top--]]=0;cnt=0;}
  54. if(!ok[vis[sa[i]]]) stk[++top]=vis[sa[i]],ok[vis[sa[i]]]=1,cnt++;
  55. if(cnt==n) return true;
  56. }
  57. return false;
  58. }
  59. int main(){
  60. n=rd();int pre,zz;
  61. for(int i=1;i<=n;i++){
  62. Mi[i]=rd();pre=0;a[++tot]=i+50000;
  63. for(int j=1;j<=Mi[i];j++) zz=rd(),a[++tot]=zz-pre+3000,pre=zz,vis[tot]=i;
  64. }
  65. for(int i=1;i<=tot;i++) m=max(m,a[i]);
  66. get_SA();get_height();int l=0,r=102,mid;
  67. while(l<=r){
  68. mid=(l+r)>>1;
  69. if(check(mid)) ans=mid,l=mid+1;
  70. else r=mid-1;
  71. }
  72. printf("%d\n",ans+1);
  73. return 0;
  74. }

BZOJ 4698: Sdoi2008 Sandy的卡片(后缀数组+差分+二分答案)的更多相关文章

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

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

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

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

  3. BZOJ 4698: Sdoi2008 Sandy的卡片

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

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

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

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

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

  6. ●BZOJ 4698 Sdoi2008 Sandy的卡片

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

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

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

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

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

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

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

随机推荐

  1. CSS分组和嵌套选择器

    CSS 分组 和 嵌套 选择器 分组选择器 在样式表中有很多具有相同样式的元素.直线模组哪家好 h1 {     color:green; } h2 {     color:green; } p { ...

  2. linux基础知识-目录结构

    linux的目录结构/bin:是Binary的缩写,这个目录存放着系统必备执行命令 /boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文 件,自己的安装别放这里 /d ...

  3. Ubuntu下Arm-Linux-GCC交叉编译环境的搭建

    1.下载arm-linux-gcc-3.4.1.tar.bz2到临时的目录下. 2.解压 arm-linux-gcc-3.4.1.tar.bz2 #tar -jxvf arm-linux-gcc-3. ...

  4. AcWing 227. 小部件厂 (高斯消元)打卡

    题目:https://www.acwing.com/problem/content/description/229/ 题意:有很多个零件,每个零件的生产时间都在3-9天之间,现在只知道每个工人的生产部 ...

  5. LOAD CSV ERROR: The used command is not allowed with this MySQL version

    要执行的sql 把csvload进db LOAD DATA LOCAL INFILE '/path/datas/temp.csv' INTO TABLE test_table_name FIELDS ...

  6. python 100day notes (1)

    x1 + x2 +x3 + x4 = 8 多少正整数解 上面的问题等同于将8个苹果分成四组每组至少一个苹果有多少种方案 即用三个隔板插7个空位. 答案C(7,3) =35 # __name__是Pyt ...

  7. C++11中vector的几种遍历方法

    假设有这样的一个vector: vector<int> line={1,2,3,4,5,6,7,8,9}; 需要输出vector里的每个元素,主函数如下: void showvec(con ...

  8. z-index只能用在定位元素上

    弄了很久才突然想到z-index只能用在被定位的元素上. 定位的时候要注意给父级定位 在ie7里有问题的部分

  9. 【lua学习笔记】——在sublime中配置Lua运行环境

    一.让Sublime可以运行lua脚本 打开sublime 选择tools-->Build System-->New Build System   在新出现的文件中输入如下内容: { &q ...

  10. mysql 安装运行学习过程中的报错问题

    错误记录(windows端): 问题1:在启动MYSQL时出现问题:“ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' ...