题链:

http://www.lydsy.com/JudgeOnline/problem.php?id=2119

题解:

这个题很好的。

首先把序列转化为差分序列,
问题转化为找到合法的子序列,使得去除最中间的 M长度,剩下的头尾完全相同。
枚举重现的长度 len,
然后在序列中每len个长度打一个标记,不难发现,如题所述的A部分一定只包含一个标记点。
然后枚举每个被标记的点 i,得到对应的 j=i+len+M,
然后求出 i和 j 向前向后可匹配的最大长度 L,R
那么对答案的贡献即为 max(0,(min(L-1,len-1)+min(R-1,len-1)+1)-len+1)

要记得离散化。要建两个后缀数组(正逆向)。可以不用long long。

代码:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #define MAXN 50050
  6. #define filein(x) freopen(#x".in","r",stdin);
  7. #define fileout(x) freopen(#x".out","w",stdout);
  8. using namespace std;
  9. int ta[MAXN],tb[MAXN],cc[MAXN],log2[MAXN];
  10. struct SAY{
  11. int sa[MAXN],rak[MAXN],hei[MAXN],stm[MAXN][18],*x,*y,h;
  12. void build(int N,int M,int *a){
  13. x=ta; y=tb; h=0; a[N]=-1;
  14. for(int i=0;i<M;i++) cc[i]=0;
  15. for(int i=0;i<N;i++) cc[x[i]=a[i]]++;
  16. for(int i=1;i<M;i++) cc[i]+=cc[i-1];
  17. for(int i=N-1;i>=0;i--) sa[--cc[x[i]]]=i;
  18. for(int k=1,p;p=0,k<N;k<<=1){
  19. for(int i=N-k;i<N;i++) y[p++]=i;
  20. for(int i=0;i<N;i++) if(sa[i]>=k) y[p++]=sa[i]-k;
  21. for(int i=0;i<M;i++) cc[i]=0;
  22. for(int i=0;i<N;i++) cc[x[y[i]]]++;
  23. for(int i=1;i<M;i++) cc[i]+=cc[i-1];
  24. for(int i=N-1;i>=0;i--) sa[--cc[x[y[i]]]]=y[i];
  25. swap(x,y); y[N]=-1; x[sa[0]]=0; M=1;
  26. for(int i=1;i<N;i++)
  27. x[sa[i]]=y[sa[i]]==y[sa[i-1]]&&y[sa[i]+k]==y[sa[i-1]+k]?M-1:M++;
  28. if(M>=N) break;
  29. }
  30. for(int i=0;i<N;i++) rak[sa[i]]=i;
  31. for(int i=0,j;i<N;i++){
  32. if(h) h--;
  33. if(rak[i]){
  34. j=sa[rak[i]-1];
  35. while(a[i+h]==a[j+h]) h++;
  36. }
  37. stm[rak[i]][0]=hei[rak[i]]=h;
  38. }
  39. for(int k=1;k<=log2[N];k++)
  40. for(int i=(1<<k)-1;i<N;i++)
  41. stm[i][k]=min(stm[i-(1<<(k-1))][k-1],stm[i][k-1]);
  42. }
  43. int query(int l,int r){
  44. static int k;
  45. l=rak[l]; r=rak[r];
  46. if(l>r) swap(l,r); l++;
  47. k=log2[r-l+1];
  48. return min(stm[l+(1<<k)-1][k],stm[r][k]);
  49. }
  50. }suf1,suf2;
  51. int A[MAXN],B[MAXN],tmp[MAXN];
  52. int N,ANS,cnt,D;
  53. int main()
  54. {
  55. scanf("%d%d",&N,&D);
  56. log2[1]=0; for(int i=2;i<=50000;i++) log2[i]=log2[i>>1]+1;
  57. for(int i=0;i<N;i++) scanf("%d",&A[i]);
  58. for(int i=0;i<N-1;i++) A[i]=A[i+1]-A[i],tmp[i]=A[i]; N--;
  59. sort(tmp,tmp+N); cnt=unique(tmp,tmp+N)-tmp;
  60. for(int i=0;i<N;i++) A[i]=lower_bound(tmp,tmp+cnt,A[i])-tmp;
  61. suf1.build(N,N+10,A);
  62. for(int i=0;i<N;i++) B[N-1-i]=A[i];
  63. suf2.build(N,N+10,B);
  64. for(int len=1,L,R;len<N/2;len++)
  65. for(int i=0,j;i<N;i+=len){
  66. j=i+len+D; if(j>=N) break;
  67. L=suf1.query(i,j);
  68. R=suf2.query(N-1-i,N-1-j);
  69. ANS+=max(0,min(L-1,len-1)+min(R-1,len-1)+1-len+1);
  70. }
  71. printf("%d",ANS);
  72. return 0;
  73. }

●BZOJ 2119 股市的预测的更多相关文章

  1. BZOJ 2119: 股市的预测 [后缀数组 ST表]

    2119: 股市的预测 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 331  Solved: 153[Submit][Status][Discuss ...

  2. BZOJ 2119: 股市的预测 SA

    2119: 股市的预测 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 434  Solved: 200[Submit][Status][Discuss ...

  3. bzoj 2119: 股市的预测

    Description 墨墨的妈妈热爱炒股,她要求墨墨为她编写一个软件,预测某只股票未来的走势.股票折线图是研究股票的必备工具,它通过一张时间与股票的价位的函数图像清晰地展示了股票的走势情况.经过长时 ...

  4. bzoj 2119 股市的预测——枚举长度的关键点+后缀数组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2119 就是找差分序列上中间差 m 的相等的两段. 考虑枚举这样一段的长度 L .可以把序列分 ...

  5. bzoj 2119 股市的预测 —— 枚举关键点+后缀数组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2119 思路就是对于这个形如 ABA 的串,枚举 A 的长度,并按照长度分出几块,找到一些关键 ...

  6. BZOJ 2119 股市的预测 (后缀数组+RMQ)

    题目大意:求一个字符串中形如$ABA$的串的数量,其中$B$的长度是给定的 有点像[NOI2016]优秀的拆分这道题 先对序列打差分,然后离散,再正反跑$SA$,跑出$st$表 进入正题 $ABA$串 ...

  7. BZOJ 2119 股市的预测(后缀数组)

    首先要差分+离散化. 然后就是求形如ABA的串有多少,其中B的长度确定为k. 我们用到了设置关键点的思想.我们枚举A的长度L.然后在\(1,1+L,1+L*2,1+L*3...\)设置关键点.然后我们 ...

  8. BZOJ 2119: 股市的预测 (Hash / 后缀数组 + st表)

    转博客大法好 自己画一画看一看,就会体会到这个设置关键点的强大之处了. CODE(sa) O(nlogn)→1436msO(nlogn)\to 1436msO(nlogn)→1436ms #inclu ...

  9. 【BZOJ 2119】 2119: 股市的预测 (后缀数组+分块+RMQ)

    2119: 股市的预测 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 404  Solved: 188 Description 墨墨的妈妈热爱炒股,她 ...

随机推荐

  1. beta冲刺计划安排

    经过紧张的Alpha阶段,很多组已经从完全不熟悉语言和环境,到现在能够实现初步的功能.下一阶段即将加快编码进度,完成系统功能.强化软件工程的体会. 凡事预则立,在Beta开始前,以小组为单位,在敏捷冲 ...

  2. JAVA中GridBagLayout布局管理器应用详解

    很多情况下,我们已经不需要通过编写代码来实现一个应用程序的图形界面,而是通过强大的IDE工具通过拖拽辅以简单的事件处理代码即可很轻松的完成.但是我们不得不面对这样操作存在的一些问题,有时候我们希望能够 ...

  3. android 广播安装指定下载的apk

    // 广播出去,由广播接收器来处理下载完成的文件   Intent sendIntent = new Intent("com.test.downloadComplete");    ...

  4. css3 文字的设置

    1.text-shadow 有3个length参数,第1个表示水平偏移,第2个表示垂直偏移,第3个表示模糊(可选) .text11{text-shadow: 3px 3px 5px #f00 ;col ...

  5. java利用iTextWorker生成pdf

    使用itext生成pdf,在linux环境下,中文全部失踪,因为itext要在linux下支持中文字体需要引入itext-asian, 并添加一个字体类. public static class Pd ...

  6. hdu 5274 Dylans loves tree

    Dylans loves tree http://acm.hdu.edu.cn/showproblem.php?pid=5274 Time Limit: 2000/1000 MS (Java/Othe ...

  7. windows 10下通过python3.6成功搭建jupyter 服务器

    最近通过python学习爬虫技术,发现一个工具jupyter notebook很不错,该工具明显优势通过浏览器可以输入多行python代码,支持在线运行以及运行结果保存功能,在线验证python小模块 ...

  8. thinkphp中ajax技术

    thinkphp可以直接返回json数据,json数据事可以跟前端的js通用的

  9. redis入门(01)redis的下载和安装

    参考链接: 命令手册 : http://www.redis.net.cn/order/ 菜鸟教程: http://www.runoob.com/redis/redis-install.html 一.概 ...

  10. 从零搭建 webpack3 环境 #1 - 安装使用

    目录: (1)什么是webpack (2)webpack核心概念 (3)环境安装 (4)开始使用webpack 1.什么是webpack 官网的一幅图对webpack的解释,从图中可以看出,webpa ...