题面

戳这里

题解

考虑把要求的那个东西拆开算,前面一个东西像想怎么算怎么算,后面那个东西在建出\(height\)数组后相当于是求所有区间\(min\)的和*2,单调栈维护一波即可。

  1. #include<bits/stdc++.h>
  2. #define For(i,x,y) for (int i=(x);i<=(y);i++)
  3. #define Dow(i,x,y) for (int i=(x);i>=(y);i--)
  4. #define cross(i,k) for (int i=first[k];i;i=last[i])
  5. using namespace std;
  6. typedef long long ll;
  7. inline ll read(){
  8. ll x=0;int ch=getchar(),f=1;
  9. while (!isdigit(ch)&&(ch!='-')&&(ch!=EOF)) ch=getchar();
  10. if (ch=='-'){f=-1;ch=getchar();}
  11. while (isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
  12. return x*f;
  13. }
  14. const int N = 500010;
  15. int n;
  16. ll ans;
  17. char c[N];
  18. int cnt[N],x[N],y[N],SA[N],Rank[N],height[N];
  19. inline void Radix_Sort(){
  20. int Max=0;
  21. For(i,1,n) cnt[x[i]]++,Max=max(Max,x[i]);
  22. For(i,1,Max) cnt[i]+=cnt[i-1];
  23. Dow(i,n,1) SA[cnt[x[y[i]]]--]=y[i];
  24. For(i,1,Max) cnt[i]=0;
  25. }
  26. inline void GetSA(){
  27. For(i,1,n) x[i]=c[i],y[i]=i;
  28. Radix_Sort();
  29. for (int i=1,p=1;p<n;i<<=1){
  30. p=0;
  31. For(j,n-i+1,n) y[++p]=j;
  32. For(j,1,n) if (SA[j]>i) y[++p]=SA[j]-i;
  33. Radix_Sort(),swap(x,y),x[SA[1]]=p=1;
  34. For(j,2,n) x[SA[j]]=(y[SA[j]]==y[SA[j-1]]&&y[SA[j]+i]==y[SA[j-1]+i])?p:++p;
  35. }
  36. For(i,1,n) Rank[SA[i]]=i;
  37. int k=0;
  38. For(i,1,n){
  39. if (Rank[i]==1) continue;k=max(0,k-1);
  40. for (int j=SA[Rank[i]-1];j+k<=n&&i+k<=n&&c[j+k]==c[i+k];k++);
  41. height[Rank[i]]=k;
  42. }
  43. }
  44. int top,q[N],l[N],r[N];
  45. inline ll SumLcp(){
  46. For(i,1,n){
  47. while (top&&height[i]<height[q[top]]) r[q[top--]]=i-1;
  48. q[++top]=i,l[i]=q[top-1]+1;
  49. }
  50. while (top) r[q[top--]]=n;
  51. ll ans=0;
  52. For(i,1,n) ans+=1ll*(r[i]-i+1)*(i-l[i]+1)*height[i];
  53. return ans;
  54. }
  55. int main(){
  56. scanf("%s",c+1),n=strlen(c+1);
  57. GetSA();
  58. For(i,1,n) ans+=1ll*(n-i+1)*(n-i)+1ll*(n-i)*(n-i+1)/2;
  59. printf("%lld",ans-SumLcp()*2);
  60. }

BZOJ3238 [Ahoi2013]差异 SA+单调栈的更多相关文章

  1. BZOJ3238 [Ahoi2013]差异 【SAM or SA】

    BZOJ3238 [Ahoi2013]差异 给定一个串,问其任意两个后缀的最长公共前缀长度的和 1.又是后缀,又是\(lcp\),很显然直接拿\(SA\)的\(height\)数组搞就好了,配合一下单 ...

  2. Codeforces 802I Fake News (hard) (SA+单调栈) 或 SAM

    原文链接http://www.cnblogs.com/zhouzhendong/p/9026184.html 题目传送门 - Codeforces 802I 题意 求一个串中,所有本质不同子串的出现次 ...

  3. [bzoj3238][Ahoi2013]差异_后缀数组_单调栈

    差异 bzoj-3238 Ahoi-2013 题目大意:求任意两个后缀之间的$LCP$的和. 注释:$1\le length \le 5\cdot 10^5$. 想法: 两个后缀之间的$LCP$和显然 ...

  4. BZOJ3238 [Ahoi2013]差异 【后缀数组 + 单调栈】

    题目链接 BZOJ3238 题解 简单题 经典后缀数组 + 单调栈套路,求所有后缀\(lcp\) #include<iostream> #include<cstdio> #in ...

  5. bzoj3238 [Ahoi2013]差异 后缀数组+单调栈

    [bzoj3238][Ahoi2013]差异 Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao Sample Ou ...

  6. 洛谷4248 AHOI2013差异 (后缀数组SA+单调栈)

    补博客! 首先我们观察题目中给的那个求\(ans\)的方法,其实前两项没什么用处,直接\(for\)一遍就求得了 for (int i=1;i<=n;i++) ans=ans+i*(n-1); ...

  7. [BZOJ3238][AHOI2013]差异(后缀数组)

    求和式的前两项可以直接算,问题是对于每对i,j计算LCP. 一个比较显然的性质是,LCP(i,j)是h[rk[i]+1~rk[j]]中的最小值. 从h的每个元素角度考虑,就是对每个h计算有多少对i,j ...

  8. [BZOJ3238][Ahoi2013]差异解题报告|后缀数组

    Description 先分析一下题目,我们显然可以直接算出sigma(len[Ti]+len[Tj])的值=(n-1)*n*(n+1)/2 接着就要去算这个字符串中所有后缀的两两最长公共前缀总和 首 ...

  9. BZOJ3238: [Ahoi2013]差异 (后缀自动机)

    Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao Sample Output 54 HINT 2<=N< ...

随机推荐

  1. 【BZOJ】2099: [Usaco2010 Dec]Letter 恐吓信

    [题意]给定长度为n和m的两个字符串S和T,要求在字符串S中取出若干段拼成T(可重复取),求最小段数,n,m<=50000. [算法]后缀自动机 || 后缀数组 [题解]对串S建SAM,然后在上 ...

  2. 带你优雅的使用 icon

    前言 本篇文章其实陆陆续续写了快半年,主体部分写好了很久了,但由于种种原因一直没有发布.首先来说说写这篇文章的主要初衷是:在做前端后台项目的时候经常会用到很多 icon 图标,刚开始还好,但随着项目的 ...

  3. redhat5.5 x64 安装oracle 11g

    http://www.cnblogs.com/jamesf/p/4769086.html http://blog.csdn.net/yakson/article/details/9012129

  4. perl6 一个猜测密码的注入

    use HTTP::UserAgent; my $ua = HTTP::UserAgent.new; my $r = HTTP::Request.new; my $c = HTTP::Cookies. ...

  5. Java Eclipse 配置

    1.清除多余记录 最近用eclipse打包jar的时候,需要指定一个main函数.需要先运行一下main函数,eclipse的Runnable JAR File Specification 下的Lau ...

  6. mac上卸载mysql

    在终端输入一下命令 sudo rm /usr/local/mysqlsudo rm -rf /usr/local/mysql*sudo rm -rf /Library/StartupItems/MyS ...

  7. aws rds

    1.还原快照,注意设置安全组的问题:不然会导致还原后连接不上:

  8. Homestead在windows7 下的搭建

    遇到的问题有 1.Homestead 的版本问题,教程git版本是 v5,最新是v7的,如果用最新,就要求vagrant的版本是 2.0的: 2.启动homestead后,出现 No input fi ...

  9. 关于JavaScript中实现继承,及prototype属性

    感谢Mozilla 让我弄懂继承. JavaScript有八种基本类型,函数属于object.所以所有函数都继承自object.//扩展:对象,基本上 JavaScript 里的任何东西都是对象,而且 ...

  10. Jmeter中的变量(三)

    变量(Variables) Jmeter中的变量(参数化)目的是为了提供改变请求变化的机制.比如登录场景,一般不能使用同一个账号做并发操作. 变量的特点 1) JMeter变量对于测试线程而言是局部变 ...