题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2119

思路就是对于这个形如 ABA 的串,枚举 A 的长度,并按照长度分出几块,找到一些关键点就是块的开头;

那么每一种 ABA 的串,A 的部分一定覆盖了一个关键点;

所以找关键点周围的匹配长度算答案,具体就是找和对应位置的 lcp + lcs,那么 ABA 可以在对应匹配的地方滑动,就能找到所有 ABA 了;

因为是差分数组所以 n-1,而且注意连接正反串的字符要比串内字符小,不是 '0'-1 而是 0 ...

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int rd()
{int ret=0,f=1; char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=0; ch=getchar();}while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar();return f?ret:-ret;
}
int Min(int x,int y){return x<y?x:y;}
int const xn=1e5+5;
int n,mx,d,m,s[xn],t[xn],tt[xn],tax[xn],sa[xn],rk[xn],tp[xn];
int op[xn],ht[xn][20],bin[20],bit[xn];
void rsort()
{for(int i=1;i<=m;i++)tax[i]=0;for(int i=1;i<=mx;i++)tax[rk[tp[i]]]++;for(int i=1;i<=m;i++)tax[i]+=tax[i-1];for(int i=mx;i;i--)sa[tax[rk[tp[i]]]--]=tp[i];
}
void work()
{for(int i=1;i<=mx;i++)rk[i]=s[i],tp[i]=i;m=n; rsort();for(int k=1;k<=mx;k<<=1){int num=0;for(int i=mx-k+1;i<=mx;i++)tp[++num]=i;for(int i=1;i<=mx;i++)if(sa[i]>k)tp[++num]=sa[i]-k;rsort(); swap(rk,tp);rk[sa[1]]=1; num=1;for(int i=2;i<=mx;i++)rk[sa[i]]=(tp[sa[i]]==tp[sa[i-1]]&&tp[sa[i]+k]==tp[sa[i-1]+k])?num:++num;if(num==mx)break;m=num;}
}
void geth()
{int k=0;for(int i=1;i<=mx;i++){if(rk[i]==1)continue;if(k)k--; int j=sa[rk[i]-1];while(s[i+k]==s[j+k]&&i+k<=mx&&j+k<=mx)k++;ht[rk[i]][0]=k;}bin[0]=1; for(int i=1;i<20;i++)bin[i]=(bin[i-1]<<1);bit[1]=0; for(int i=2;i<=mx;i++)bit[i]=bit[i>>1]+1;for(int i=1;i<20;i++)for(int j=1;j+bin[i]-1<=mx;j++)ht[j][i]=Min(ht[j][i-1],ht[j+bin[i-1]][i-1]);
}
int getlcp(int x,int y)
{if(x==y)return mx-x+1;x=rk[x]; y=rk[y];if(x>y)swap(x,y); x++;int r=bit[y-x+1];return Min(ht[x][r],ht[y-bin[r]+1][r]);
}
int main()
{n=rd(); d=rd();for(int i=1;i<=n;i++)t[i]=rd();for(int i=n;i>1;i--)t[i]=t[i]-t[i-1],tt[i]=t[i];sort(t+1,t+n+1); int tot=unique(t+1,t+n+1)-t-1;for(int i=2;i<=n;i++)tt[i]=lower_bound(t+1,t+tot+1,tt[i])-t;n--; mx=2*n+1;for(int i=1;i<=n;i++)s[i]=tt[i+1];s[n+1]=0;//0for(int i=n+2,k=n;k;i++,k--)s[i]=s[k],op[k]=i;work(); geth(); int ans=0;for(int k=1;k<=n;k++)for(int i=1;i+k+d<=n;i+=k){int j=i+k+d;int l1=getlcp(i,j),l2=getlcp(op[i],op[j]);l1=Min(l1,k); l2=Min(l2,k);if(l1&&l2&&l1+l2-1>=k)ans+=l1+l2-1-k+1;else if(l1&&l1>=k)ans+=l1-k+1;else if(l2&&l2>=k)ans+=l2-k+1;}printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/Zinn/p/10325682.html

bzoj 2119 股市的预测 —— 枚举关键点+后缀数组相关推荐

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

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

  2. 【BZOJ 1031】[JSOI2007]字符加密Cipher(后缀数组模板)

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1031 [题意] [题解] 后缀数组模板题; 把整个字符串扩大一倍. 即长度乘2 然后搞 ...

  3. bzoj 1640 bzoj 1692: [Usaco2007 Dec]队列变换(后缀数组)

    1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1756  Solved: 737 [Submit][ ...

  4. BZOJ 2780: [Spoj]8093 Sevenk Love Oimaster( 后缀数组 + 二分 + RMQ + 树状数组 )

    全部串起来做SA, 在按字典序排序的后缀中, 包含每个询问串必定是1段连续的区间, 对每个询问串s二分+RMQ求出包含s的区间. 然后就是求区间的不同的数的个数(经典问题), sort queries ...

  5. [bzoj2119]股市的预测

    2119: 股市的预测 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 256 Solved: 119 [Submit][Status][Discuss ...

  6. UOJ #219 BZOJ 4650 luogu P1117 [NOI2016]优秀的拆分 (后缀数组、ST表)

    UOJ #219 BZOJ 4650 luogu P1117 [NOI2016]优秀的拆分 (后缀数组.ST表) 连NOI Day1T1都不会做...看了题解都写不出来还要抄Claris的代码.. 题 ...

  7. 【NOI2016】优秀的拆分【后缀数组】【ST表】【关键点】【调和级数复杂度】【差分】

    传送门 题意:如果一个字符串可以拆分为AABB的形式,其中A和B是任意非空字符串,则我们这种拆分是优秀的.求给定串的所有子串的拆分方案数之和. N≤30000N \leq30000N≤30000 本来 ...

  8. [BZOJ 3238] [AHOI 2013] 差异 【后缀数组 + 单调栈】

    题目链接:BZOJ - 3238 题目分析 显然,这道题就是求任意两个后缀之间的LCP的和,这与后缀数组的联系十分明显. 求出后缀数组后,求出字典序相邻两个后缀的LCP,即 Height 数组. 那么 ...

  9. BZOJ 4278: [ONTAK2015]Tasowanie 后缀数组 + 贪心 + 细节

    Description 给定两个数字串A和B,通过将A和B进行二路归并得到一个新的数字串T,请找到字典序最小的T. Input 第一行包含一个正整数n(1<=n<=200000),表示A串 ...

最新文章

  1. 在ESXi5,1,ESXi5.5安装异步驱动程序
  2. spring集成 JedisCluster 连接 redis3.0 集群
  3. FL2440的U-boot-2009.08移植(三)支持Nor FLASH
  4. linux 字符驱动阻塞型 等待队列
  5. HDU 1556 前缀和 树状数组 线段树
  6. 详解HTML5网页结构
  7. 从入门到入土:Nessus出击:使用nessus扫描某台靶机
  8. IntelliJ IDEA 2020.1 首个稳定版重磅发布!
  9. win7如何设置通电自动开机_WIN7自动开机怎么设置?
  10. 如何破解CuteFTP 4.0,CuteFTP,逆向工程技术
  11. Excel表格中超链接转图片
  12. MySql 常用命令集
  13. Windows10升级21H1黑屏解决办法
  14. 【HCIE-RS 天梯路】STP RSTP MSTP
  15. (免费分享)基于springboot论坛bbs系统
  16. HDU 3132 Taunt Exposure Estimation(数学)
  17. Joda-Time使用参考
  18. java中非法的表达式开始什么意思,Java非法表达式开始,到底哪里错了?
  19. 0018-量化第五天:QMT—日内回转回测注释
  20. 用几何画板画七边形的方法

热门文章

  1. C#程序出现内存溢出错误的解决办法
  2. SQL Server开发人员应聘常见问题妙解
  3. LeetCode 376. 摆动序列 中等难度
  4. 国家卫健委:我国男女性成人平均身高分别为169.7厘米和158厘米
  5. 我国科学家成功研制全球神经元规模最大的类脑计算机
  6. 达摩院成立XG实验室 阿里官宣进军5G
  7. Python学习资源 | 3个高性能开源计算机视觉库
  8. 在Labview中调用M文件(Matlab文件)
  9. CreateThread创建线程函数详细讲解
  10. mybatis动态代理