【AHOI2013】bzoj3238 差异
来源:互联网 发布:海外淘宝网 编辑:程序博客网 时间:2024/06/05 02:55
实际上只需要求出后缀两两之间的lcp之和。也就是求height数组所有区间的区间最小值之和。这样扫描一遍,用单调栈维护区间最小height值递增的序列的左端点即可,建出sa以后是
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define LL long longconst int maxn=500010;char s[maxn];int sa[maxn],rank[maxn],height[maxn],f[maxn],sta[maxn],val[maxn],cnt[maxn],n;int main(){ int p,m=26,top; LL ans=0,now=0; scanf("%s",s+1); n=strlen(s+1); for (int i=1;i<=n;i++) cnt[rank[i]=s[i]-'a'+1]++; for (int i=2;i<=m;i++) cnt[i]+=cnt[i-1]; for (int i=n;i;i--) sa[cnt[rank[i]]--]=i; for (int k=1;;k<<=1) { p=0; for (int i=n-k+1;i<=n;i++) f[++p]=i; for (int i=1;i<=n;i++) if (sa[i]>k) f[++p]=sa[i]-k; for (int i=1;i<=m;i++) cnt[i]=0; for (int i=1;i<=n;i++) cnt[rank[f[i]]]++; for (int i=2;i<=m;i++) cnt[i]+=cnt[i-1]; for (int i=n;i;i--) sa[cnt[rank[f[i]]]--]=f[i]; for (int i=1;i<=n;i++) f[i]=rank[i]; rank[sa[1]]=1; for (int i=2;i<=n;i++) if (f[sa[i]]!=f[sa[i-1]]||f[sa[i]+k]!=f[sa[i-1]+k]) rank[sa[i]]=rank[sa[i-1]]+1; else rank[sa[i]]=rank[sa[i-1]]; m=rank[sa[n]]; if (m>=n) break; } for (int i=1;i<=n;i++) { height[rank[i]]=height[rank[i-1]]; if (height[rank[i]]) height[rank[i]]--; while (s[i+height[rank[i]]]==s[sa[rank[i]-1]+height[rank[i]]]) height[rank[i]]++; } sta[top=1]=1; for (int i=2;i<=n;i++) { p=i; while (top&&height[i]<=val[top]) { now-=(LL)(p-sta[top])*(val[top]-height[i]); p=sta[top]; top--; } sta[++top]=p; val[top]=height[i]; now+=height[i]; ans-=now; } //printf("%lld\n",-ans); ans*=2; for (int i=1;i<=n;i++) ans+=(LL)3*i*(i-1)/2; printf("%lld\n",ans);}
0 0
- [Ahoi2013]差异 bzoj3238
- 【AHOI2013】【BZOJ3238】差异
- [BZOJ3238][Ahoi2013]差异
- [BZOJ3238][Ahoi2013]差异
- bzoj3238: [Ahoi2013]差异
- 【AHOI2013】bzoj3238 差异
- 【bzoj3238】[Ahoi2013]差异
- 【BZOJ3238】【Ahoi2013】差异 后缀自动机
- [BZOJ3238] [AHOI2013] 差异 - 后缀自动机
- bzoj3238 [Ahoi2013]差异 后缀自动机
- 【bzoj3238】[Ahoi2013]差异 后缀数组+单调栈
- [BZOJ3238][Ahoi2013]差异 做题笔记
- 【bzoj3238】[Ahoi2013]差异 后缀数组+单调栈
- 【bzoj3238】【AHOI2013】【差异】【后缀数组+单调栈】
- 后缀数组+单调栈 【Ahoi2013】bzoj3238 差异
- [BZOJ3238][Ahoi2013][后缀自动机][树形DP]差异
- BZOJ3238: [Ahoi2013]差异(后缀数组)
- [BZOJ3238][Ahoi2013]差异(后缀自动机||后缀数组)
- python数据分析与挖掘实战-4
- com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
- 学习淘淘商城第四十五课(使用SolrJ查询索引库)
- 优化后的冒泡排序(Bubble Sort)
- 准备做个Ftp自动更新的程序,提前做下准备
- 【AHOI2013】bzoj3238 差异
- java 读取资源文件最详细解读
- 192_IO流_BufferedReader_接收用户键盘输入
- pip install 出现Exception
- 蓝牙会干掉Zigbee吗?
- 第2章 基本程序设计
- URL get传参中文乱码
- Android Studio gradle 编译提示‘default not found’ 解决办法
- DatabaseConnectionPool--数据库连接池