Time Limit: 20 Sec
Memory Limit: 512 MB

Description

Input

一行,一个字符串S

Output

一行,一个整数,表示所求值

Sample Input

cacao

Sample Output

54

HINT

2&lt;=N&lt;=5000002&lt;=N&lt;=5000002<=N<=500000 , S由小写英文字母组成

题解:
学了一发后缀数组,
sa[i]=jsa[i] = jsa[i]=j表示为按照从小到大排名为i的后缀 是以j(下标)开头的后缀
rk[i]=jrk[i] = jrk[i]=j表示为按照从小到大排名 以i为下标开始的后缀 排名为jjj
h[i]h[i]h[i]表示lcp(i,i−1)lcp(i,i-1)lcp(i,i−1)
用单调栈维护lcp(L,R)=h[i]lcp(L,R)=h[i]lcp(L,R)=h[i]重复计数就取左不取右。

#include<bits/stdc++.h>
#define LiangJiaJun main
#define ll long long
#define pa pair<int,int>
#define INF 1000000000
using namespace std;
ll ans;
int l,k,p,q,a[500004],v[500004];
int sa[2][500004],rk[2][500004],h[500004];
char str[500004];
int st[500004],L[500004],R[500004],top;
void work(int *sa,int *rk,int *SA,int *RK){for(int i=1;i<=l;i++)v[rk[sa[i]]]=i;for(int i=l;i;i--){if(sa[i]>k){SA[v[rk[sa[i]-k]]--]=sa[i]-k;}}for(int i=l-k+1;i<=l;i++)SA[v[rk[i]]--]=i;for(int i=1;i<=l;i++){RK[SA[i]]=RK[SA[i-1]]+(rk[SA[i-1]]!=rk[SA[i]]||rk[SA[i-1]+k]!=rk[SA[i]+k]);}return ;
}
void presa(){for(int i=1;i<=l;i++)v[a[i]]++;for(int i=1;i<=30;i++)v[i]+=v[i-1];for(int i=1;i<=l;i++)sa[p][v[a[i]]--]=i;for(int i=1;i<=l;i++){rk[p][sa[p][i]]=rk[p][sa[p][i-1]]+(a[sa[p][i]]!=a[sa[p][i-1]]);}for(k=1;k<l;k<<=1,swap(p,q))work(sa[p],rk[p],sa[q],rk[q]);for(int k=0,i=1;i<=l;i++){int j=sa[p][rk[p][i]-1];while(str[j+k]==str[i+k])k++;h[rk[p][i]]=k;if(k>0)k--;}
}
void solve(){h[0]=-INF;for(int i=1;i<=l;i++)ans+=1LL*i*(l-1);top=0;st[0]=0;for(int i=1;i<=l;i++){while(h[i]<=h[st[top]])top--;if(st[top]==0)L[i]=1;else L[i]=st[top]+1;st[++top]=i;}h[l+1]=-INF;top=0;st[0]=l+1;for(int i=l;i;i--){while(h[i]<h[st[top]])top--;if(st[top]==l+1)R[i]=l;else R[i]=st[top]-1;st[++top]=i;}for(int i=1;i<=l;i++){ans-=2LL*(i-L[i]+1)*(R[i]-i+1)*h[i];}
}
int w33ha(){memset(v,0,sizeof(v));memset(h,0,sizeof(h));memset(sa,0,sizeof(sa));memset(rk,0,sizeof(rk));ans=0;p=0;q=1;l=strlen(str+1);for(int i=1;i<=l;i++)a[i]=str[i]-'a'+1;presa();solve();printf("%lld\n",ans);return 0;
}
int LiangJiaJun(){while(scanf("%s",str+1)!=EOF)w33ha();return 0;
}

[BZOJ3238][Ahoi2013]差异相关推荐

  1. BZOJ3238[Ahoi2013]差异

    BZOJ3238[Ahoi2013]差异 题目描述 n<=500000n<=500000n,都是小写字母 输入 一行,一个字符串S 输出 一行,一个整数,表示所求值 Solution 公式 ...

  2. BZOJ3238: [Ahoi2013]差异

    3238: [Ahoi2013]差异 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 4840  Solved: 2298 [Submit][Stat ...

  3. [BZOJ3238] [AHOI2013] 差异 - 后缀自动机

    3238: [Ahoi2013]差异 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 1968  Solved: 896 [Submit][Statu ...

  4. bzoj3238 [Ahoi2013]差异

    题目链接 树状数组+单调栈 计算出每个后缀的前面.后面第一个h[]比它小的(前闭后开),乘起来计算答案 1 #include<algorithm> 2 #include<iostre ...

  5. [BZOJ3238][AHOI2013]差异 [后缀数组+单调栈]

    题目地址 - GO-> 题目大意: 给定一个长度为 nn 的字符串SS,令TiTi表示它从第ii个字符开始的后缀,求以下这个式子的值: ∑1≤i<j≤nlen(Ti)+len(Tj)−2× ...

  6. bzoj3238 [Ahoi2013]差异 后缀自动机

    这个题虽然看起来比较麻烦,但其实有一点搞懂了就好做了 每一个后缀的前缀的lcp一定是这个串里的子串, 对于全部子串,如果它不是后缀,那一定可以找到这个串对应的后缀, 而这样的子串和后缀子串是没有区别的 ...

  7. bzoj3238 [Ahoi2013]差异 后缀自动机

    题意:给出一个串,求其中任意两个字串的lcp的总和. 我们可以对于这个串建一颗后缀自动机,实际上,他的parent边树就是一颗后缀树,我们在后缀树上统计答案,设f表示right集合的大小,可以理解为后 ...

  8. bzoj3238: [Ahoi2013]差异(后缀自动机)

    传送门 后缀自动机好题. 题意: 做法:samsamsam 废话 考虑翻转字串,这样后缀的最长公共前缀等于前缀的最长公共后缀. 然后想到parentparentparent树上面两个串的最长公共后缀跟 ...

  9. 【bzoj3238】[Ahoi2013]差异

    3238: [Ahoi2013]差异 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 3425  Solved: 1559 [Submit][Stat ...

最新文章

  1. Spring Boot实战:拦截器与过滤器
  2. JavaScript基础(三)流程控制
  3. Windows Server 2012体验之卸载辅助域控制器
  4. java button不显示_这段JAVA程序怎么不显示button等控件啊
  5. NOIP2014洛谷P2296:寻找道路(bfs)
  6. 使用Python查看汉诺塔移动详细过程
  7. mysql的number类型对应的db2_【转】oracle数据库NUMBER数据类型
  8. python批量音频转格式_GitHub - shede333/SWConvertVideoToAudio: Python批量转换 视频 为 音频MP3(即提取音频文件)...
  9. 新版的Eclipse(Oxygen)安装完Subversive后,现时无法自动安装SVN Connector,无论选择哪个都会自动关闭。
  10. python3处理普通文件【open内置函数】
  11. LittleVGL体验记录
  12. 使用u盘如何装linux系统教程视频教程,如何使用u盘安装linux系统
  13. 子域名劫持漏洞详解、挖掘和防护
  14. 第一章 引论 -- 项目管理知识体系指南(PMBOK指南)(第五版)
  15. js获取字符串的字节长度
  16. P4408 [NOI2003] 逃学的小孩 题解
  17. 你的生日代表什么花的寓意?
  18. 微信小程序自定义图片上传组件
  19. IEEE 802.15.4和ZigBee
  20. c语言储存字母,有两个磁盘文件A和B,各存放一行字母-有两个磁盘文件A和B,各存放一行字母C语言实现-吾爱编程网...

热门文章

  1. Classless 和 Classful
  2. 创建对象与对象属性添加
  3. 如何重启 php-fpm
  4. DHGNN:Dynamic Hypergraph Neural Networks
  5. SpringCloud(6) 分布式事务【概念、常见框架选择 - tx-lcn】
  6. 从后端到前端,JavaScript和Java有关系吗
  7. 【JavaWeb】AJAX
  8. 视频的上传及购买播放
  9. 关于预答辩研究生汇报内容及方式的几点要求
  10. 如何判断线性方程组是一个解还是无穷个解