【BZOJ3238】差异,后缀数组+单调栈维护height
来源:互联网 发布:网络发稿平台 编辑:程序博客网 时间:2024/05/16 09:36
Time:2016.05.23
Author:xiaoyimi
转载注明出处谢谢
传送门
思路:
题意已经说的很明白了。
关键在于如何快速求得各lcp的和
有一个重要的性质
排名为i和j(i<j)的最长前缀长度=min(height[i+1..j])
对于排名为i的后缀,想要求得
注意:
1.起初对栈底放入len+1,使得栈不为空,从而计算各个值
2.对于原式中lcp以外的东西,我们可以把它化成(n是字符串长度)
代码:
#include<bits/stdc++.h>#define M 500004#define LL long long using namespace std;char s[M];int w[M],cnt[M],sa[M],rank[M],tmp[M],id[M],height[M];LL ans,f[M];stack<int>S;void SA(int len,int up){ int *rk=rank,p=0,*t=tmp,d=1; for (int i=0;i<len;i++) cnt[rk[i]=w[i]]++; for (int i=1;i<up;i++) cnt[i]+=cnt[i-1]; for (int i=len-1;i>=0;i--) sa[--cnt[rk[i]]]=i; for (;;) { for (int i=len-d;i<len;i++) id[p++]=i; for (int i=0;i<len;i++) if (sa[i]>=d) id[p++]=sa[i]-d; for (int i=0;i<up;i++) cnt[i]=0; for (int i=0;i<len;i++) cnt[t[i]=rk[id[i]]]++; for (int i=1;i<up;i++) cnt[i]+=cnt[i-1]; for (int i=len-1;i>=0;i--) sa[--cnt[t[i]]]=id[i]; swap(t,rk); p=1; rk[sa[0]]=0; for (int i=0;i<len-1;i++) if (sa[i]+d<len&&sa[i+1]+d<len&&t[sa[i]]==t[sa[i+1]]&&t[sa[i]+d]==t[sa[i+1]+d]) rk[sa[i+1]]=p-1; else rk[sa[i+1]]=p++; if (p==len) break; d<<=1;up=p;p=0; }}void Height(int len){ for (int i=1;i<=len;i++) rank[sa[i]]=i; int k=0,x; for (int i=0;i<len;i++) { k=max(k-1,0); x=sa[rank[i]-1]; while (w[i+k]==w[x+k]) k++; height[rank[i]]=k; }} main(){ scanf("%s",s); int len=strlen(s); ans=((LL)len*(len+1)*(len*2+1)/6-(LL)len*(len+1)/2)*3/2; for (int i=0;i<len;i++) w[i]=s[i]-'a'+1; SA(len+1,28); Height(len); S.push(len+1); for (int i=len;i>=1;i--) { while(height[S.top()]>height[i]) S.pop(); f[i]=(LL)height[i]*(S.top()-i)+f[S.top()]; ans-=f[i]<<1; S.push(i); } printf("%lld",ans);}
0 0
- 【BZOJ3238】差异,后缀数组+单调栈维护height
- 【bzoj3238】[Ahoi2013]差异 后缀数组+单调栈
- 【bzoj3238】[Ahoi2013]差异 后缀数组+单调栈
- 【bzoj3238】【AHOI2013】【差异】【后缀数组+单调栈】
- 后缀数组+单调栈 【Ahoi2013】bzoj3238 差异
- BZOJ3238【后缀数组】【单调栈】
- 【BZOJ3238】差异 后缀数组
- [BZOJ3238][Ahoi2013]差异(后缀数组+单调栈||后缀自动机+树形dp)
- BZOJ3238: [Ahoi2013]差异(后缀数组)
- [Tyvj 1860] 后缀数组 倍增O(nlogn) 求sa[],height[]模板,单调栈维护,求特征值
- 【bzoj3238】差异 后缀自动机
- [BZOJ3238][Ahoi2013]差异(后缀自动机||后缀数组)
- 【BZOJ3238】【Ahoi2013】差异 后缀自动机
- [BZOJ3238] [AHOI2013] 差异 - 后缀自动机
- bzoj3238 [Ahoi2013]差异 后缀自动机
- BZOJ 3238 AHOI 2013 差异 后缀数组+单调栈
- [BZOJ 3238][AHOI 2013]差异(后缀数组+单调栈)
- BZOJ 3238 [Ahoi2013]差异 后缀数组+单调栈
- 5-3 逆序的三位数 (10分)
- 5-4 BCD解密 (10分)
- 代码训练营———将文本文件复制到另一个文件中
- nyoj 1239 引水工程 河南省ACM2015年省赛D 题
- javascript之数组对象与数组常用方法
- 【BZOJ3238】差异,后缀数组+单调栈维护height
- 5-5 表格输出 (5分)
- Foundation => Objective-C - Const
- Android常用控件(一)
- C/C++常见头文件汇总
- 会场安排问题
- 杭电1999
- 5-6 混合类型数据格式化输入 (5分)
- uva 11988 Broken Keyboard (a.k.a. Beiju Text)