这个题虽然看起来比较麻烦,但其实有一点搞懂了就好做了

每一个后缀的前缀的lcp一定是这个串里的子串,

对于全部子串,如果它不是后缀,那一定可以找到这个串对应的后缀,

而这样的子串和后缀子串是没有区别的,因为他们出现的位置相同,而后缀自动机记录每个子串的出现次数,

这个子串和以它开头所在的后缀相同的都是这个子串,由于SAM的高压性,这个子串余剩的部分一定不会与它所在后缀相同(不然会被并成一个点),

所以,由于对答案有影响的只有次数>=2的串,而次数>=2一定是开始位置不一样的,所对应的>=2个后缀也是起始位置不同的后缀,他们的一部分公共前缀就是这个子串,且这>=2个后缀的公共前缀也不会再其他地方算过,所以这就是lcp。

然后贡献就是C(2,n)*(len(o)-len(fa))

答案就是(n-1)((n+1)*n/2)-贡献和

码:

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
char str[500005];
int ch[1000005][27],l[1000005],fu[1000005],cnt,p,np,q,nq;
long long ans,len,sz[1000005];
vector<int>v[1000005];
void jia(int o)
{int i,np=++cnt;l[np]=l[p]+1;while(p&&ch[p][o]==0)ch[p][o]=np,p=fu[p];if(p==0)fu[np]=1;else{q=ch[p][o];if(l[p]+1!=l[q]){int nq=++cnt;l[nq]=l[p]+1;for(i=0;i<=26;i++)ch[nq][i]=ch[q][i];fu[nq]=fu[q];fu[q]=fu[np]=nq;for(;ch[p][o]==q;p=fu[p])ch[p][o]=nq;            }else fu[np]=q;}sz[np]++;p=np;
}
void dfs(int o,int fa)
{int i;for(i=0;i<v[o].size();i++){int nd=v[o][i];dfs(nd,o);sz[o]+=sz[nd];      }   ans+=(l[o]-l[fa])*(sz[o]*(sz[o]-1)/2)*2;
}
int main()
{int i,o;scanf("%s",str);cnt=p=1;len=strlen(str);  for(i=0;i<len;i++){jia(str[i]-'a');     }
for(i=2;i<=cnt;i++)
v[fu[i]].push_back(i);dfs(1,0);printf("%lld",(len-1)*((1+len)*len/2)-ans);
}

bzoj3238 [Ahoi2013]差异 后缀自动机相关推荐

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

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

  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. python36块砖36人搬算法_剑指offer python实现 66道算法题
  2. boost::fusion::set用法的测试程序
  3. 你可能不知道的 10 条 SQL 技巧
  4. LightOJ 1393 Crazy Calendar(博弈)题解
  5. 【Scrapy】Unsupported major.minor version 52.0 [duplicate]
  6. 训练日志 2018.9.5
  7. 手机python编程文件如何转文档_Python 开发者面向文档编程的正确姿势
  8. 基于JAVA+SpringBoot+Mybatis+Vue+MYSQL的在线考试系统
  9. 使用windows命令和iconv.exe批量转换文件编码
  10. Scintilla教程(1): 入门介绍
  11. Android 开发中版本兼容性问题
  12. harmonyos蓝牙,鸿蒙OS 蓝牙概述
  13. require.context()的用法
  14. 深度学习:乳腺检测abnormality detection in mammography +CAM
  15. 阿里云IoT平台APP配网入口
  16. 小学五年级计算机教学论文,人教版小学五年级数学教学论文
  17. 双轴反作用轮定点自平衡杆动力学模型
  18. (附源码)计算机毕业设计ssm爱音乐网站
  19. 海思16DV300系统搭建过程
  20. 水溶性CY3.5-马来酰亚胺,Sulfo-Cyanine3.5 maleimide

热门文章

  1. 红橙Darren视频笔记 万能Dialog builder设计模式
  2. Android线程池的简单使用
  3. 关于如何在word中写公式的方法
  4. 三星Samsung笔记本电脑开机进入BIOS的方法与BIOS设置全功能菜单(F2)
  5. Servlet萌新基础
  6. day2 java的数据转换与强制转换
  7. 赋值运算符(AssignmentOperator)
  8. knife4j导出html有误,knife4j无法生成完整的响应说明
  9. 台式计算机光标时不时跳动,解决方案:如何解决联想笔记本触摸板上的光标跳动?...
  10. 质数因子 java_质数因子