2119: 股市的预测

Time Limit: 10 Sec Memory Limit: 259 MB
Submit: 256 Solved: 119
[Submit][Status][Discuss]
Description

墨墨的妈妈热爱炒股,她要求墨墨为她编写一个软件,预测某只股票未来的走势。股票折线图是研究股票的必备工具,它通过一张时间与股票的价位的函数图像清晰地展示了股票的走势情况。经过长时间的观测,墨墨发现很多股票都有如下的规律:之前的走势很可能在短时间内重现!如图可以看到这只股票A部分的股价和C部分的股价的走势如出一辙。通过这个观测,墨墨认为他可能找到了一个预测股票未来走势的方法。进一步的研究可是难住了墨墨,他本想试图统计B部分的长度与发生这种情况的概率关系,不过由于数据量过于庞大,依赖人脑的力量难以完成,于是墨墨找到了善于编程的你,请你帮他找一找给定重现的间隔(B部分的长度),有多少个时间段满足首尾部分的走势完全相同呢?当然,首尾部分的长度不能为零。

Input

输入的第一行包含两个整数N、M,分别表示需要统计的总时间以及重现的间隔(B部分的长度)。接下来N行,每行一个整数,代表每一个时间点的股价。

Output

输出一个整数,表示满足条件的时间段的个数

Sample Input

12 4

1 2 3 4 8 9 1 2 3 4 8 9

Sample Output

6

【样例说明】

6个时间段分别是:3-9、2-10、2-8、1-9、3-11、4-12。

HINT

对于100%的数据,4≤N≤50000 1≤M≤10 M≤N 所有出现的整数均不超过32位含符号整数。

把原来的数差分一下,就变成了求给定 B B的长度的ABAABA这种形式的子串的个数。
暴力的方法肯定可以枚举 A A的长度,然后在枚举第一个A的起点,判断是否可行。这样是O(n2)O(n^2)的。
这个做法可以优化一下。
每次在枚举第一个 A A的起点的时候,我们不一定要枚举n个位置。假设当前枚举的长度是xx,可以吧这个串每 x x个分成一份。枚举每个组的开头。假设当前枚举的位置是ii。那么第二个 A A的起点就是i+x+mi+x+m。这样只需要看一下从这两个位置同时往前或者往后有多少一样的(也就是分别向前向后求 lcp lcp)。最后把答案加上这两个长度的和就行了。
只是求 lcp lcp会有重复的情况,所以向左向右找的最大长度都不能超过 x x。
时间复杂度:O(nlogn)O(nlogn)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define LL long long
const int N=100010;
LL ans;
int s[N],n,m,o,sa[N],rank[N],height[N],t1[N],t2[N],c[N],st[N][20],Log[N],a[N];
inline int in(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();return x*f;
}
inline bool cmp(int *y,int p,int q,int k){int o0=(p+k>=n+n+1)?-1:y[p+k];int o1=(q+k>=n+n+1)?-1:y[q+k];return o0==o1&&y[p]==y[q];
}
inline void build_sa(int o){int i,k,*x=t1,*y=t2,p;for(i=0;i<o;++i) c[i]=0;for(i=0;i<n+n+1;++i) ++c[x[i]=s[i+1]];for(i=1;i<o;++i) c[i]+=c[i-1];for(i=n+n;~i;--i) sa[--c[x[i]]]=i;for(k=1;k<=n+n+1;k<<=1){for(p=0,i=n+n+1-k;i<n+n+1;++i) y[p++]=i;for(i=0;i<n+n+1;++i) if(sa[i]>=k) y[p++]=sa[i]-k;for(i=0;i<o;++i) c[i]=0;for(i=0;i<n+n+1;++i) ++c[x[y[i]]];for(i=1;i<o;++i) c[i]+=c[i-1];for(i=n+n;~i;--i) sa[--c[x[y[i]]]]=y[i];swap(x,y);o=1;x[sa[0]]=0;for(i=1;i<n+n+1;++i) x[sa[i]]=cmp(y,sa[i],sa[i-1],k)?o-1:o++;if(o>=n+n+1) break;}
}
inline void build_height(){int i,k=0,j;for(i=0;i<n+n+1;++i) rank[sa[i]]=i;for(i=0;i<n+n+1;++i){if(!rank[i]) continue;k=k?--k:k;j=sa[rank[i]-1];while(s[j+k+1]==s[i+k+1]) ++k;height[rank[i]]=k;}memset(st,127/3,sizeof(st));    for(i=0;i<n+n+1;++i) st[i][0]=height[i];for(j=1;j<=20;++j)for(i=0;i+(1<<(j-1))<n+n+1;++i)st[i][j]=min(st[i][j-1],st[i+(1<<(j-1))][j-1]);for(j=0,i=1;i<=n+n+1;++i){if((1<<(j+1))<=i) ++j;Log[i]=j;}
}
inline int LCP(int x,int y){if(x>y) swap(x,y);int k=Log[y-x];++x;return min(st[x][k],st[y-(1<<k)+1][k]);
}
int main(){int i,j;n=in();m=in();--n;for(i=1;i<=n+1;++i) s[i]=in();for(i=1;i<=n;++i) s[i]=s[i+1]-s[i];for(i=n;i;--i) s[n+n+1-i]=s[i];for(i=1;i<=n+n;++i) a[i]=s[i];sort(a+1,a+n+n+1);int size=unique(a+1,a+n+n+1)-a-1;for(i=1;i<=n;++i)s[i]=lower_bound(a+1,a+size+1,s[i])-a;for(i=n+n;i>=n+1;--i)s[i+1]=lower_bound(a+1,a+size+1,s[i])-a;s[n+1]=size+1;build_sa(size+2);build_height();int pre,sub;for(i=1;i+i+m<=n;++i)for(pre=0,j=1;i+j+m<=n;j+=i){sub=min(i,LCP(rank[j-1],rank[j+i+m-1]));if(sub+pre>=i) ans+=(LL)(sub+pre-i+1);pre=min(i-1,LCP(rank[n+n+2-(j+i-1)-1],rank[n+n+2-(j+i+i+m-1)-1]));}printf("%lld\n",ans);
}

[bzoj2119]股市的预测相关推荐

  1. bzoj2119 股市的预测

    题意:给你一个字符串,将其差分之后,问有多少个子串满足长度为m+2i且前i个字符组成的子串和后i个字符组成的子串相同.(m在题中给出,i可以为任意值) 分析:考虑子串[l,r]什么情况下满足条件.首先 ...

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

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

  3. 基于R语言对股市价格预测的ARIMA建模

    基于R语言对股市价格预测的ARIMA建模 获取数据 tushare ID=399224 利用ARIMA对股市价格进行拟合后预测,本次实验的数据源于tushare 首先导入本次实验所需要的所有包 req ...

  4. 先知ppt_先知对股市的预测

    先知ppt In a previous post, I used stock market data to show how prophet detects changepoints in a sig ...

  5. 【MATLAB数据处理实用案例详解(13)】——利用Elman网络实现上证股市开盘价预测

    目录 一.问题描述 二.Elman网络预测上证股市开盘价原理 三.算法步骤 3.1 加载数据 3.2 构造样本集 3.3 划分训练集和测试集 3.4 创建Elman神经网络 3.5 网络训练 3.6 ...

  6. python cnn 股市_CNN预测股票走势基于Tensorflow(思路+程序)

    源代码,请在文末查询 前言 我们希望找出跟随价格上涨的模式.通过每日收盘价,MA,KD,RSI,yearAvgPrice 本次推文研究只是展示深入学习的一个例子. 结果估计不是很好.希望抛砖引玉,给大 ...

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

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

  8. 预测股市?echart折线图展示CPI,PPI剪刀差和股市的关系

    CPI:消费者物价指数,代表群众购买物品的价格的增长率.我们可以很暴力的认为CPI就是公司的物品售价增长率. PPI:工业生产者出产价格指数,顾名思义是公司生产物品的成本价的增长率. 如果我们用CPI ...

  9. #1.7股市预测发展历程随想

    股市相对经济,相当于个股相对大盘的关系.一个微观,一个宏观.股市仅仅是经济的一个方面.这样也就会表现出,股市相对于经济的预测难度会更大一些,股市的数学"随机性"会更强一些. 天气现 ...

最新文章

  1. 知乎热问:成为算法工程师的路上,掌握什么技术会感觉自我提升突飞猛进?
  2. 想服务器不宕机,你了解Linux“体检”指标吗?
  3. PAT甲题题解-1001. A+B Format (20)-字符串处理,水
  4. 牛人学习h264运动估计的方法
  5. B站这套教程火了,火速搬运!限时删除~
  6. ros melodic 版本sudo rosdep init和rosdep upgrade失败的解决办法
  7. Spark学习笔记:索引分区映射
  8. PHP高级教程-高级过滤器
  9. [转]5个有趣的Python小知识,返回结果让人出乎意料~
  10. L1-046 整除光棍-PAT团体程序设计天梯赛GPLT
  11. mysql数据库相关操作
  12. 如何选择和部署长尾关键词
  13. 四级地址插件升级改造(京东商城地址选择插件)city-picker
  14. 蓝牙5 BR/EDR LMP层分析
  15. 基于Unity的VR迷宫游戏项目技术分享
  16. 2021辽宁省大学生程序设计竞赛 C D E F G I L
  17. 服务器配置防火墙的地址伪装和端口转发实例
  18. matlab实现加减乘除、乘方、开平方、带括号和结果分析的GUI计算器
  19. Windows各版本安装包分享
  20. 后端工程结构和项目规约

热门文章

  1. [网络工程师]-计算机硬件基础-Flynn分类法
  2. 【向生活低头】拷贝文件到文件夹中
  3. 如何做互联网软件产品评测报告?相关测试报告模板范例方案
  4. web-highlighter
  5. 音乐api搭建php音乐下载,百度音乐api接口
  6. eclipse中导入项目后项目名称出现红叉叉,但项目能跑
  7. 【Linux学习】之访问命令行
  8. Q42将牌洗为逆序1
  9. Java 网络编程API以及实例
  10. android 动态生成tablelayout,动态tablelayout创建的android应用程序崩溃