3238: [Ahoi2013]差异

Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 1968  Solved: 896
[Submit][Status][Discuss]

Description

Input

一行,一个字符串S

Output

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

Sample Input

cacao

Sample Output


54

HINT

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

Source

[Submit][Status][Discuss]

感觉窝会求后缀数组然后完全不会用……

好伐我还是写了SAM2333333。

显然题意只要我们求出∑LCP(i,j)(i!=j)就好

首先我们跑一遍SAM求出后缀树,然后拓扑一下就能求出所有right集合的大小。

显然两个后缀的最长公共前缀长就是他们在后缀树上的lca的深度。

我们可以考虑对每个深度进行分段,即点x对答案的贡献只包含其在后缀树上的父节点的深度以上且在自身深度以下的答案。

显然这样做的答案就是∑deep[i]*∑right[i]-right[son[i]]

又因为right[i]=∑right[son[i]]

那么每个点的贡献就是deep[i]*right[i]*right[i-1]了

#include"bits/stdc++.h"
using namespace std;
typedef long long ll;const int N=1000005,A=26;
struct SAM{char s[N];int t,l,q[N],last,a[N];int fail[N],e[N][A],v[N],d[N];SAM(){t=last=1;}void extend(int c){int np=++t,p=last;d[np]=d[p]+1,v[last=np]=1;for(;!e[p][c]&&p;p=fail[p])e[p][c]=np;if(!p)fail[np]=1;else {int q=e[p][c],nq;if(d[q]!=d[p]+1){nq=++t;d[nq]=d[p]+1;memcpy(e[nq],e[q],sizeof(int[A]));fail[nq]=fail[q];fail[np]=fail[q]=nq;for(;e[p][c]==q;p=fail[p])e[p][c]=nq;} else fail[np]=q;}}void read(){scanf("%s",s);l=strlen(s);}void build(){for(int i=0;i<l;i++)extend(s[i]-'a');}ll getans(){for(int i=1;i<=t;i++)a[d[i]]++;for(int i=1;i<=l;i++)a[i]+=a[i-1];for(int i=t;i;i--)q[a[d[i]]--]=i;for(int i=t;i;i--)v[fail[q[i]]]+=v[q[i]];v[1]=v[0]=0;ll ret=(ll)(l-1)*l*(l+1)/2;for(int i=2;i<=t;i++)ret-=(ll)v[i]*(v[i]-1)*(d[i]-d[fail[i]]);return ret;}
} sam;int main(){sam.read();sam.build();printf("%lld\n",sam.getans());return 0;
}

[BZOJ3238] [AHOI2013] 差异 - 后缀自动机相关推荐

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

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

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

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

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

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

  4. 【bzoj3238】差异 后缀自动机

    AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=3238 [题解] 题上所给公式可以化为 其中: =1×(n-1)+2×(n-2)+3×(n- ...

  5. BZOJ3238[Ahoi2013]差异

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

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

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

  7. BZOJ3238: [Ahoi2013]差异

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

  8. BZOJ 3238: [Ahoi2013]差异 [后缀数组 单调栈]

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

  9. BZOJ 3238 差异 [后缀自动机]

    题目 一个长度为n的字符串S,令TiT_i表示它从第i个字符开始的后缀.求 ∑1≤i<j≤nlen(Ti)+len(Tj)−2∗lcp(Ti,Tj) \sum_{1\le i 其中len(a)表 ...

最新文章

  1. 专业版云南_云南核桃集中上市市民“囤货”忙,天眼查:我国8万余家核桃相关企业,云南省数量最多...
  2. 周末包邮送书和小红包中奖名单公布
  3. 热点分析图_通过分析功率MOSFET管的工作特性,判断其损坏原因
  4. 20 行 Python 代码说清量子霸权!
  5. mysql rpm包_自制mysql.rpm安装包
  6. Hibernate api 之常见的类(配置类,会话工厂类,会话类)
  7. 利用数组求前n个质数
  8. 117页电子书!优酷 APP “暗黑模式”设计与技术完整总结
  9. win7系统关闭445端口
  10. IDEA社区版详细安装2022最新版(保姆式)
  11. js函数式编程之柯里化(curry)
  12. 计算机中图分类法,计算机中图分类号.doc
  13. 每日一题---摔手机
  14. Word中插入PDF
  15. python进阶必读汇总
  16. 测试点击屏幕次数的软件_测试大佬分享:WEB和APP测试小结
  17. qq物联网 android sdk,物联网在腾讯:QQ物联
  18. A. Unusual Competitions
  19. Mysql设置创建时间字段和更新时间字段自动获取时间,填充时间
  20. sdut oj 实验7 函数的应用

热门文章

  1. Excel给文档设置(取消)密码(打开密码和修改密码)
  2. 台达 PLC 浮点数 乘法和除法
  3. fabric通过java怎么整合RS纠删码的实现
  4. 架构设计---高可用的处理
  5. DeepRank: A New Deep Architecture for Relevance Ranking in Information Retrieval
  6. Linux ssh远程连接
  7. Go Moudle笔记
  8. 没有实习经验的应届生如何找到一份数据分析类工作?
  9. Java初级面试笔记
  10. 人工智能学JAVA吗_人工智能是学java吗