后缀自动机+后缀树

有一种不难想到的后缀数组的做法,详见黄学长题解

然而我做这题的目的主要是熟悉一下后缀自动机和后缀树- -

一个有趣的性质:反串的后缀自动机的parent树就是正串的后缀树,其树上的边权长度=parent树上儿子的len-父亲的len

构出后缀树之后就是一个小DP啦。

#include<cstdio>
#include<cstring>
#define N 500010
#define S 28
using namespace std;
namespace ziqian
{typedef long long ll;char s[N];ll ans = 0;int last[N*2], ecnt, siz[N*2]; struct edge{int next, to;}e[N<<1];void addedge(int a, int b){e[++ecnt] = (edge){last[a], b}; last[a] = ecnt;}struct SAM{SAM *par, *ch[S];int len;}mem[N*2], *tot, *null, *tai, *root;SAM *newSAM(int l){SAM *r = ++tot;*r = *null; r->len = l;return r;}void init_SAM(){tot = mem;null = ++tot;null -> par = null;for(int i = 0; i < S; i++) null->ch[i] = null;null->len = 0;root = newSAM(0); tai = root;}void extend(int v){SAM *p = tai, *np = newSAM(p->len + 1); tai = np; siz[np - mem] = 1; for(; p != null && p->ch[v] == null; p = p->par) p->ch[v] = np;if(p == null) np -> par = root;else{SAM *q = p->ch[v];if(p->len + 1 == q->len) np->par = q;else{SAM *nq = newSAM(p->len + 1);*nq = *q;nq -> len = p->len + 1;q->par = np->par = nq;for(; p != null && p->ch[v] == q; p = p->par) p->ch[v] = nq; }}}void dp(int x){for(int i = last[x]; i; i = e[i].next){int y = e[i].to;dp(y);ans -= 2ll * siz[x] * siz[y] * (mem+x)->len;siz[x] += siz[y];}}void main(){scanf("%s",s+1);int n = strlen(s+1);init_SAM();for(int i = n; i; i--) extend(s[i] - 'a');for(int i = 1; i <= n; i++) ans += (ll) i * (n-1);for(SAM *cur = tot; cur != mem; cur--)addedge(cur->par - mem, cur - mem);dp(root - mem);printf("%lld\n",ans);}
}
int main()
{ziqian::main();
} 

BZOJ 3238 [Ahoi2013]差异相关推荐

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

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

  2. bzoj 3238: [Ahoi2013]差异(后缀数组+单调栈)

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

  3. @bzoj - 3238@ [Ahoi2013]差异

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个长度为 n 的字符串 S,令 Ti 表示它从第 i 个字 ...

  4. bzoj 3238: [Ahoi2013]差异

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

  5. 3238: [Ahoi2013]差异

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

  6. 【BZOJ】 3238: [Ahoi2013]差异

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3238 求:$${\sum _{i=1}^{n-1}\sum _{j=i+1}^{n}len ...

  7. 【BZOJ】3238: [Ahoi2013]差异

    [题意]给定长度为n的小写字母字符串,令Ti表示以i开头的后缀,求Σ[Ti+Tj-2*lcp(Ti,Tj)],1<=i<j<=n. [算法]后缀自动机 [题解]Σ(Ti+Tj)只与n ...

  8. 【bzoj 3238】差异

    传送门~ 解题思路 求后缀数组以后搞个单调栈. 因为height数组的意义让这个单调栈很烦,注意要理清思路再写. 代码: #include<algorithm> #include<i ...

  9. BZOJ3238: [Ahoi2013]差异

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

最新文章

  1. Android——TabLayout 默认某个选项卡选中
  2. 图片压缩工具optipng/jpegoptim安装
  3. python 获取指定目录下的图片文件
  4. Java异常处理(2)--异常处理机制及自定义异常
  5. JSON数组分配输出每个li
  6. 单线程为什么cpu慢_面试时说Redis是单线程的,被喷惨了!
  7. 基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 权限管理
  8. Linux下Tomcat性能优化--文件句柄数增大
  9. linux sdb目录,linux – / dev / sdb:没有这样的文件或目录(但是/ dev / sdb1等存在)...
  10. Hibernate常用配置
  11. CAD卸载重新安装方法,使用清理卸载工具完全彻底删除干净CAD各种残留注册表和文件。
  12. Linux切换jdk版本
  13. 如何使用cpolar内网穿透群晖NAS套件
  14. CS231n Assiganment#1解析(一)——KNN
  15. 阿里云的服务器居然泡在“水”里?| 数据中心参观有感
  16. 这个神器:功能强大的 Mac 剪切板记录管理工具
  17. 如何用python赚钱_一篇文章教你使用Python自动赚取支付宝积分,网友:发家致富?...
  18. python批量检索文献_基于Python的文献检索系统设计与实现
  19. 恶意代码修改IE和注册表恢复全集
  20. 微信推送平台-测试号定制推送

热门文章

  1. ADC芯片ADS1258采集数据的读取
  2. Deinterlacer(影像解交错)概念与解析
  3. MSAA,SSAA,CSAA,CFAA...如何正确地为您的游戏设置抗锯齿模式
  4. C语言简单编程案例(四)
  5. vue使用过滤器,文字超出显示省略号
  6. java反射机制是什么_java的反射机制是什么?
  7. 机器学习——概率分类(三)高斯概率密度与混合高斯模型
  8. mac电脑安装maple2017
  9. 并网光伏逆变器的基本设计
  10. SM2椭圆曲线公钥密码算法的JAVA实现