题链:

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。

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 50050
#define filein(x) freopen(#x".in","r",stdin);
#define fileout(x) freopen(#x".out","w",stdout);
using namespace std;
int ta[MAXN],tb[MAXN],cc[MAXN],log2[MAXN];
struct SAY{
int sa[MAXN],rak[MAXN],hei[MAXN],stm[MAXN][18],*x,*y,h;
void build(int N,int M,int *a){
x=ta; y=tb; h=0; a[N]=-1;
for(int i=0;i<M;i++) cc[i]=0;
for(int i=0;i<N;i++) cc[x[i]=a[i]]++;
for(int i=1;i<M;i++) cc[i]+=cc[i-1];
for(int i=N-1;i>=0;i--) sa[--cc[x[i]]]=i;
for(int k=1,p;p=0,k<N;k<<=1){
for(int i=N-k;i<N;i++) y[p++]=i;
for(int i=0;i<N;i++) if(sa[i]>=k) y[p++]=sa[i]-k;
for(int i=0;i<M;i++) cc[i]=0;
for(int i=0;i<N;i++) cc[x[y[i]]]++;
for(int i=1;i<M;i++) cc[i]+=cc[i-1];
for(int i=N-1;i>=0;i--) sa[--cc[x[y[i]]]]=y[i];
swap(x,y); y[N]=-1; x[sa[0]]=0; M=1;
for(int i=1;i<N;i++)
x[sa[i]]=y[sa[i]]==y[sa[i-1]]&&y[sa[i]+k]==y[sa[i-1]+k]?M-1:M++;
if(M>=N) break;
}
for(int i=0;i<N;i++) rak[sa[i]]=i;
for(int i=0,j;i<N;i++){
if(h) h--;
if(rak[i]){
j=sa[rak[i]-1];
while(a[i+h]==a[j+h]) h++;
}
stm[rak[i]][0]=hei[rak[i]]=h;
}
for(int k=1;k<=log2[N];k++)
for(int i=(1<<k)-1;i<N;i++)
stm[i][k]=min(stm[i-(1<<(k-1))][k-1],stm[i][k-1]);
}
int query(int l,int r){
static int k;
l=rak[l]; r=rak[r];
if(l>r) swap(l,r); l++;
k=log2[r-l+1];
return min(stm[l+(1<<k)-1][k],stm[r][k]);
}
}suf1,suf2;
int A[MAXN],B[MAXN],tmp[MAXN];
int N,ANS,cnt,D;
int main()
{
scanf("%d%d",&N,&D);
log2[1]=0; for(int i=2;i<=50000;i++) log2[i]=log2[i>>1]+1;
for(int i=0;i<N;i++) scanf("%d",&A[i]);
for(int i=0;i<N-1;i++) A[i]=A[i+1]-A[i],tmp[i]=A[i]; N--;
sort(tmp,tmp+N); cnt=unique(tmp,tmp+N)-tmp;
for(int i=0;i<N;i++) A[i]=lower_bound(tmp,tmp+cnt,A[i])-tmp;
suf1.build(N,N+10,A);
for(int i=0;i<N;i++) B[N-1-i]=A[i];
suf2.build(N,N+10,B);
for(int len=1,L,R;len<N/2;len++)
for(int i=0,j;i<N;i+=len){
j=i+len+D; if(j>=N) break;
L=suf1.query(i,j);
R=suf2.query(N-1-i,N-1-j);
ANS+=max(0,min(L-1,len-1)+min(R-1,len-1)+1-len+1);
}
printf("%d",ANS);
return 0;
}

●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. 第14、15週PTA題目的處理

    題目1 選擇法排序 1.實驗代碼 #include <stdio.h> #include <stdlib.h> int main() { int n,index,exchang ...

  2. Java语言基础组成

    写完才发现,这个博客不提供目录这个功能,真是想骂爹了...... 目录 关键字 标识符 注释 常量和变量 运算符 语句 函数 数组 1.关键字 描述:刚刚开始学这个的时候,真是傻傻分不清楚,不过没关系 ...

  3. bzoj千题计划217:bzoj2333: [SCOI2011]棘手的操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=2333 读入所有数据,先模拟一遍所有的合并操作 我们不关心联通块长什么样,只关心联通块内有谁 所以可以 ...

  4. Python内置函数(38)——zip

    英文文档: zip(*iterables) Make an iterator that aggregates elements from each of the iterables. Returns ...

  5. iot会议纪要 20180105

    1.需求概述设备 <-->物接入 <--> 云端认证授权协议解析主题 端点endpoint(地址)->设备thing(用户)->身份principal(密码)-&g ...

  6. linux centos6.8 下安装mysql 步骤

    安装环境:vmware12.centos6.8.centos中配置阿里云数据元 1.下载mysql 运行: sudo yum -y install mysql-server 如果下载失败,可以卸载重新 ...

  7. Python的下载及安装

    1.官网下载地址:https://www.python.org/downloads/ 2.python设置环境变量: 在系统变量里添加Python的安装位置 3.在cmd里输入python里即可

  8. Python之递归函数

    递归函数 初识递归函数 递归函数的定义:在一个函数里再调用这个函数本身 Python为了考虑保护内存占用情况,有一个递归深度的限制. 探究递归的默认最大深度: def foo(n): print(n) ...

  9. PV 动态供给 - 每天5分钟玩转 Docker 容器技术(153)

    前面的例子中,我们提前创建了 PV,然后通过 PVC 申请 PV 并在 Pod 中使用,这种方式叫做静态供给(Static Provision). 与之对应的是动态供给(Dynamical Provi ...

  10. ZOJ-1456 Minimum Transport Cost---Floyd变形+路径输出字典序最小

    题目链接: https://vjudge.net/problem/ZOJ-1456 题目大意: Spring国家有N个城市,每队城市之间也许有运输路线,也可能没有.现在有一些货物要从一个城市运到另一个 ...