原文链接https://www.cnblogs.com/zhouzhendong/p/9069171.html

题目传送门 - BZOJ2119

题意

  给定一个股票连续$n$个时间点的价位,问有多少段股票走势在间隔$m$单位时间之后重现?

  $n\leq 5\times 10^4,m\leq 10$

题解

  和 http://www.cnblogs.com/zhouzhendong/p/9025092.html 此题十分类似。

  这里稍微讲讲本题的不同之处。

  首先相邻值求差,转换成字符串匹配。

  然后,由于要间隔$m$个字符,所以我们在找关键点的对应点的时候要稍微改一改。

  对于得到的$lcs$和$lcp$,在计算的时候有一点小小的注意点。

  详见代码。

代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LL;
  4. const int N=100005;
  5. int n,m,a[N],tot=0;
  6. map <int,int> mp;
  7. int SA[N],rank[N],tmp[N],height[N],tax[N];
  8. int ST[N][20];
  9. void Sort(int n,int m){
  10. for (int i=0;i<=m;i++)
  11. tax[i]=0;
  12. for (int i=1;i<=n;i++)
  13. tax[rank[i]]++;
  14. for (int i=1;i<=m;i++)
  15. tax[i]+=tax[i-1];
  16. for (int i=n;i>=1;i--)
  17. SA[tax[rank[tmp[i]]]--]=tmp[i];
  18. }
  19. bool cmp(int rk[],int x,int y,int w){
  20. return rk[x]==rk[y]&&rk[x+w]==rk[y+w];
  21. }
  22. void Suffix_Array(int s[],int n){
  23. memset(SA,0,sizeof SA);
  24. memset(tmp,0,sizeof tmp);
  25. memset(rank,0,sizeof rank);
  26. memset(height,0,sizeof height);
  27. for (int i=1;i<=n;i++)
  28. rank[i]=s[i],tmp[i]=i;
  29. int m=tot+1;
  30. Sort(n,m);
  31. for (int w=1,p=0;p<n;w<<=1,m=p){
  32. p=0;
  33. for (int i=n-w+1;i<=n;i++)
  34. tmp[++p]=i;
  35. for (int i=1;i<=n;i++)
  36. if (SA[i]>w)
  37. tmp[++p]=SA[i]-w;
  38. Sort(n,m);
  39. swap(rank,tmp);
  40. rank[SA[1]]=p=1;
  41. for (int i=2;i<=n;i++)
  42. rank[SA[i]]=cmp(tmp,SA[i],SA[i-1],w)?p:++p;
  43. }
  44. for (int i=1,j,k=0;i<=n;height[rank[i++]]=k)
  45. for (k=max(k-1,0),j=SA[rank[i]-1];s[i+k]==s[j+k];k++);
  46. height[1]=0;
  47. }
  48. void Get_ST(int n){
  49. memset(ST,0,sizeof ST);
  50. for (int i=1;i<=n;i++){
  51. ST[i][0]=height[i];
  52. for (int j=1;j<20;j++){
  53. ST[i][j]=ST[i][j-1];
  54. if (i-(1<<(j-1))>0)
  55. ST[i][j]=min(ST[i][j],ST[i-(1<<(j-1))][j-1]);
  56. }
  57. }
  58. }
  59. int Query(int L,int R){
  60. int val=floor(log(R-L+1)/log(2));
  61. return min(ST[L+(1<<val)-1][val],ST[R][val]);
  62. }
  63. int LCP(int x,int y){
  64. x=rank[x],y=rank[y];
  65. return Query(min(x,y)+1,max(x,y));
  66. }
  67. int LCS(int x,int y){
  68. return LCP(n*2+2-x,n*2+2-y);
  69. }
  70. int main(){
  71. scanf("%d%d",&n,&m);
  72. for (int i=1;i<=n;i++)
  73. scanf("%d",&a[i]);
  74. n--;
  75. mp.clear();
  76. for (int i=1;i<=n;i++){
  77. a[i]=a[i+1]-a[i];
  78. if (mp[a[i]]==0)
  79. mp[a[i]]=++tot;
  80. a[n*2+2-i]=a[i]=mp[a[i]];
  81. }
  82. a[n+1]=tot+1;
  83. Suffix_Array(a,n*2+1);
  84. Get_ST(n*2+1);
  85. LL ans=0;
  86. for (int L=1;L<=n;L++)
  87. for (int i=1;i+L+m<=n;i+=L){
  88. int x=i,y=i+L+m;
  89. int lcp=min(LCP(x,y),L),lcs=min(LCS(x,y),L);
  90. int len=lcp+lcs-(lcp>0&&lcs>0);
  91. ans+=max(len-L+1,0);
  92. }
  93. printf("%lld\n",ans);
  94. return 0;
  95. }

  

BZOJ2119 股市的预测 字符串 SA ST表的更多相关文章

  1. BZOJ2534 Uva10829L-gap字符串 字符串 SA ST表

    原文链接https://www.cnblogs.com/zhouzhendong/p/9240665.html 题目传送门 - BZOJ2534 题意 有一种形如 $uvu$ 形式的字符串,其中 $u ...

  2. BZOJ4556 [Tjoi2016&Heoi2016]字符串 SA ST表 二分答案 主席树

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ4556.html 题目传送门 - BZOJ4556 题意 给定一个长度为 $n$ 的字符串 $s$ . ...

  3. BZOJ3172 [Tjoi2013]单词 字符串 SA ST表

    原文链接http://www.cnblogs.com/zhouzhendong/p/9026543.html 题目传送门 - BZOJ3172 题意 输入$n(n\leq 200)$个字符串,保证长度 ...

  4. UOJ#219/BZOJ4650 [NOI2016]优秀的拆分 字符串 SA ST表

    原文链接http://www.cnblogs.com/zhouzhendong/p/9025092.html 题目传送门 - UOJ#219 (推荐,题面清晰) 题目传送门 - BZOJ4650 题意 ...

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

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

  6. BZOJ3230 相似子串 字符串 SA ST表

    原文链接http://www.cnblogs.com/zhouzhendong/p/9033092.html 题目传送门 - BZOJ3230 题意 给定字符串$s$.长度为$n$. 现在有$Q$组询 ...

  7. Codeforces Round #422 (Div. 2)E. Liar sa+st表+dp

    题意:给你两个串s,p,问你把s分开顺序不变,能不能用最多k段合成p. 题解:dp[i][j]表示s到了前i项,用了j段的最多能合成p的前缀是哪里,那么转移就是两种,\(dp[i+1][j]=dp[i ...

  8. [NOI2016]优秀的拆分&&BZOJ2119股市的预测

    [NOI2016]优秀的拆分 https://www.lydsy.com/JudgeOnline/problem.php?id=4650 题解 如果我们能够统计出一个数组a,一个数组b,a[i]表示以 ...

  9. bzoj 3230: 相似子串【SA+st表+二分】

    总是犯低级错误,st表都能写错-- 正反分别做一遍SA,预处理st表方便查询lcp,然后处理a[i]表示前i个后缀一共有多少个本质不同的子串,这里的子串是按字典序的,所以询问的时候直接在a上二分排名就 ...

随机推荐

  1. (一)七种AOP实现方法

    在这里列表了我想到的在你的应用程序中加入AOP支持的所有方法.这里最主要的焦点是拦截,因为一旦有了拦截其它的事情都是细节. Approach 方法 Advantages 优点 Disadvantage ...

  2. .NET基础之构造函数

    1.构造函数: 分为实例构造函数.静态构造函数.私有构造函数. 使用new表达式创建某个类的对象时, 1.1实例构造函数: (1)构造函数的名字与类名相同: (2)使用new表达式创建类的对象或者结构 ...

  3. eclipse的工程中如何查找字符串

    ctrl + h 后弹出 tab选项, 你选择 file search 然后在下面输入要查找的字符串 workset 那里选择你要查找的项目 默认是全部项目进行查找

  4. iOS9 新功能:Support Universal Links,iOS10 openUrl新函数

    先看官方文档:https://developer.apple.com/library/ios/documentation/General/Conceptual/AppSearch/UniversalL ...

  5. Ubuntu16.04安装MySQL

      本篇教程在示例步骤中使用了以下版本的软件.操作时,请您以实际软件版本为准. 操作系统:Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-105-generic x86_64) ...

  6. web的分页方法

    web分页的三种方式,闲来无事总结一下. 1.使用前端表格插件进行分页 例如用bootstrap的拓展table组件,注意设置其分页属性时设置为"client", 即是 sideP ...

  7. 高性能JavaScript读后感

    这本书让lz对js性能优化有了更深刻的理解,现在因为我们通常用第三方构建工具webpack.gulp等诸如此类,之前总是听说什么dom操作影响性能呢,对这个概念总是有点模糊,但看完这本书之后后,相对而 ...

  8. java源代码

    //信1705-1 20173527 刘津鑫 package money; import java.io.IOException; import java.io.Serializable; impor ...

  9. Mac下Java JDK的下载安装和配置

    一.下载安装 打开一个搜索引擎,输入JDK,找到Java JDK 如图:  点击打开,同意协议开始下载如图: 下载好以后,安装即可. 安装成功以后,进入根目录,可以找到JDK安装的位置: 资源库——& ...

  10. Mysql 5.7 CentOS 7 安装MHA

    Table of Contents 1. MHA简介 1.1. 功能 1.2. MHA切换逻辑 1.3. 工具 2. 环境 2.1. 软件 2.2. 环境 3. Mysql 主从复制 3.1. Mys ...