BZOJ2119 股市的预测 字符串 SA ST表
原文链接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$,在计算的时候有一点小小的注意点。
详见代码。
代码
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long LL;
- const int N=100005;
- int n,m,a[N],tot=0;
- map <int,int> mp;
- int SA[N],rank[N],tmp[N],height[N],tax[N];
- int ST[N][20];
- void Sort(int n,int m){
- for (int i=0;i<=m;i++)
- tax[i]=0;
- for (int i=1;i<=n;i++)
- tax[rank[i]]++;
- for (int i=1;i<=m;i++)
- tax[i]+=tax[i-1];
- for (int i=n;i>=1;i--)
- SA[tax[rank[tmp[i]]]--]=tmp[i];
- }
- bool cmp(int rk[],int x,int y,int w){
- return rk[x]==rk[y]&&rk[x+w]==rk[y+w];
- }
- void Suffix_Array(int s[],int n){
- memset(SA,0,sizeof SA);
- memset(tmp,0,sizeof tmp);
- memset(rank,0,sizeof rank);
- memset(height,0,sizeof height);
- for (int i=1;i<=n;i++)
- rank[i]=s[i],tmp[i]=i;
- int m=tot+1;
- Sort(n,m);
- for (int w=1,p=0;p<n;w<<=1,m=p){
- p=0;
- for (int i=n-w+1;i<=n;i++)
- tmp[++p]=i;
- for (int i=1;i<=n;i++)
- if (SA[i]>w)
- tmp[++p]=SA[i]-w;
- Sort(n,m);
- swap(rank,tmp);
- rank[SA[1]]=p=1;
- for (int i=2;i<=n;i++)
- rank[SA[i]]=cmp(tmp,SA[i],SA[i-1],w)?p:++p;
- }
- for (int i=1,j,k=0;i<=n;height[rank[i++]]=k)
- for (k=max(k-1,0),j=SA[rank[i]-1];s[i+k]==s[j+k];k++);
- height[1]=0;
- }
- void Get_ST(int n){
- memset(ST,0,sizeof ST);
- for (int i=1;i<=n;i++){
- ST[i][0]=height[i];
- for (int j=1;j<20;j++){
- ST[i][j]=ST[i][j-1];
- if (i-(1<<(j-1))>0)
- ST[i][j]=min(ST[i][j],ST[i-(1<<(j-1))][j-1]);
- }
- }
- }
- int Query(int L,int R){
- int val=floor(log(R-L+1)/log(2));
- return min(ST[L+(1<<val)-1][val],ST[R][val]);
- }
- int LCP(int x,int y){
- x=rank[x],y=rank[y];
- return Query(min(x,y)+1,max(x,y));
- }
- int LCS(int x,int y){
- return LCP(n*2+2-x,n*2+2-y);
- }
- int main(){
- scanf("%d%d",&n,&m);
- for (int i=1;i<=n;i++)
- scanf("%d",&a[i]);
- n--;
- mp.clear();
- for (int i=1;i<=n;i++){
- a[i]=a[i+1]-a[i];
- if (mp[a[i]]==0)
- mp[a[i]]=++tot;
- a[n*2+2-i]=a[i]=mp[a[i]];
- }
- a[n+1]=tot+1;
- Suffix_Array(a,n*2+1);
- Get_ST(n*2+1);
- LL ans=0;
- for (int L=1;L<=n;L++)
- for (int i=1;i+L+m<=n;i+=L){
- int x=i,y=i+L+m;
- int lcp=min(LCP(x,y),L),lcs=min(LCS(x,y),L);
- int len=lcp+lcs-(lcp>0&&lcs>0);
- ans+=max(len-L+1,0);
- }
- printf("%lld\n",ans);
- return 0;
- }
BZOJ2119 股市的预测 字符串 SA ST表的更多相关文章
- BZOJ2534 Uva10829L-gap字符串 字符串 SA ST表
原文链接https://www.cnblogs.com/zhouzhendong/p/9240665.html 题目传送门 - BZOJ2534 题意 有一种形如 $uvu$ 形式的字符串,其中 $u ...
- BZOJ4556 [Tjoi2016&Heoi2016]字符串 SA ST表 二分答案 主席树
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ4556.html 题目传送门 - BZOJ4556 题意 给定一个长度为 $n$ 的字符串 $s$ . ...
- BZOJ3172 [Tjoi2013]单词 字符串 SA ST表
原文链接http://www.cnblogs.com/zhouzhendong/p/9026543.html 题目传送门 - BZOJ3172 题意 输入$n(n\leq 200)$个字符串,保证长度 ...
- UOJ#219/BZOJ4650 [NOI2016]优秀的拆分 字符串 SA ST表
原文链接http://www.cnblogs.com/zhouzhendong/p/9025092.html 题目传送门 - UOJ#219 (推荐,题面清晰) 题目传送门 - BZOJ4650 题意 ...
- BZOJ 2119: 股市的预测 [后缀数组 ST表]
2119: 股市的预测 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 331 Solved: 153[Submit][Status][Discuss ...
- BZOJ3230 相似子串 字符串 SA ST表
原文链接http://www.cnblogs.com/zhouzhendong/p/9033092.html 题目传送门 - BZOJ3230 题意 给定字符串$s$.长度为$n$. 现在有$Q$组询 ...
- 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 ...
- [NOI2016]优秀的拆分&&BZOJ2119股市的预测
[NOI2016]优秀的拆分 https://www.lydsy.com/JudgeOnline/problem.php?id=4650 题解 如果我们能够统计出一个数组a,一个数组b,a[i]表示以 ...
- bzoj 3230: 相似子串【SA+st表+二分】
总是犯低级错误,st表都能写错-- 正反分别做一遍SA,预处理st表方便查询lcp,然后处理a[i]表示前i个后缀一共有多少个本质不同的子串,这里的子串是按字典序的,所以询问的时候直接在a上二分排名就 ...
随机推荐
- (一)七种AOP实现方法
在这里列表了我想到的在你的应用程序中加入AOP支持的所有方法.这里最主要的焦点是拦截,因为一旦有了拦截其它的事情都是细节. Approach 方法 Advantages 优点 Disadvantage ...
- .NET基础之构造函数
1.构造函数: 分为实例构造函数.静态构造函数.私有构造函数. 使用new表达式创建某个类的对象时, 1.1实例构造函数: (1)构造函数的名字与类名相同: (2)使用new表达式创建类的对象或者结构 ...
- eclipse的工程中如何查找字符串
ctrl + h 后弹出 tab选项, 你选择 file search 然后在下面输入要查找的字符串 workset 那里选择你要查找的项目 默认是全部项目进行查找
- iOS9 新功能:Support Universal Links,iOS10 openUrl新函数
先看官方文档:https://developer.apple.com/library/ios/documentation/General/Conceptual/AppSearch/UniversalL ...
- Ubuntu16.04安装MySQL
本篇教程在示例步骤中使用了以下版本的软件.操作时,请您以实际软件版本为准. 操作系统:Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-105-generic x86_64) ...
- web的分页方法
web分页的三种方式,闲来无事总结一下. 1.使用前端表格插件进行分页 例如用bootstrap的拓展table组件,注意设置其分页属性时设置为"client", 即是 sideP ...
- 高性能JavaScript读后感
这本书让lz对js性能优化有了更深刻的理解,现在因为我们通常用第三方构建工具webpack.gulp等诸如此类,之前总是听说什么dom操作影响性能呢,对这个概念总是有点模糊,但看完这本书之后后,相对而 ...
- java源代码
//信1705-1 20173527 刘津鑫 package money; import java.io.IOException; import java.io.Serializable; impor ...
- Mac下Java JDK的下载安装和配置
一.下载安装 打开一个搜索引擎,输入JDK,找到Java JDK 如图: 点击打开,同意协议开始下载如图: 下载好以后,安装即可. 安装成功以后,进入根目录,可以找到JDK安装的位置: 资源库——& ...
- 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 ...