题目链接:差异

  写题时发现这道题当初已经用后缀数组写过了……但是既然学了后缀自动机那就再写一遍吧……

  观察一下题目所给的式子:\[\sum_{1\leqslant i < j \leqslant n}len(T_i)+len(T_j)-2lcp(T_i,T_j)\]

  可以发现前面两项其实是可以在\(O(n)\)的时间内算出来的。于是我们就只需要考虑后面那一项怎么算。

  题目要求的是所有后缀的最长公共前缀之和,那么把串反一下就变成了所有前缀的最长公共后缀之和。

  那么,我们构出翻转后的串的\(parent\)树(其实就是原串的后缀树),两个串的公共后缀就是他们在\(parent\)树上的\(lca\)节点包含的最长子串长度。

  然后我们就可以枚举每个节点作为\(lca\),然后统计一下它的两两子树\(right\)集合大小之积即可。

  下面贴代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
#define maxn 1000010using namespace std;
typedef long long llg;char s[maxn>>1];
int n,tot,la,head[maxn],next[maxn],to[maxn],tt;
int son[maxn][26],len[maxn],fa[maxn],siz[maxn];
llg ans;void link(int x,int y){to[++tt]=y;next[tt]=head[x];head[x]=tt;}
void insert(int p,int x){int np=++tot; siz[np]=1; len[np]=len[p]+1;for(;p && !son[p][x];p=fa[p]) son[p][x]=np;if(!p) fa[np]=1;else{int q=son[p][x];if(len[q]==len[p]+1) fa[np]=q;else{int nq=++tot;memcpy(son[nq],son[q],sizeof(son[q]));fa[nq]=fa[q]; fa[np]=fa[q]=nq; len[nq]=len[p]+1;for(;son[p][x]==q;p=fa[p]) son[p][x]=nq;}}la=np;
}void dfs(int u){for(int i=head[u],v;v=to[i],i;i=next[i]){dfs(v);ans-=(llg)siz[u]*siz[v]*len[u],siz[u]+=siz[v];}
}int main(){File("a");scanf("%s",s+1); n=strlen(s+1); tot=la=1;for(int i=n>>1;i;i--) swap(s[i],s[n-i+1]);for(int i=1;i<=n;i++) insert(la,s[i]-'a');for(int i=2;i<=tot;i++) link(fa[i],i);dfs(1); ans<<=1; ans+=((llg)(n+1)*n*(n-1))>>1;printf("%lld\n",ans);return 0;
}

转载于:https://www.cnblogs.com/lcf-2000/p/6297196.html

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. BZOJ 3238 [Ahoi2013]差异

    后缀自动机+后缀树 有一种不难想到的后缀数组的做法,详见黄学长题解 然而我做这题的目的主要是熟悉一下后缀自动机和后缀树- - 一个有趣的性质:反串的后缀自动机的parent树就是正串的后缀树,其树上的 ...

  6. 3238: [Ahoi2013]差异

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

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

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

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

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

  9. 【bzoj 3238】差异

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

  10. BZOJ3238: [Ahoi2013]差异

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

最新文章

  1. 使用python模拟Simple方式连接ldap
  2. 百度AI原生云实践: 基于容器云打造 AI 开发基础设施
  3. boost::format模块测试构造对象和基本解析
  4. 【Linux】一步一步学Linux——usermod命令(86)
  5. (七)Docker网络配置
  6. updatepanel失效怎么办_【点滴积累】解决jQuery绑定事件在updatepanel更新后失效的方法...
  7. 动态规划在求解背包问题中的应用(JAVA)--回溯法、记忆化法
  8. html5环形流程图,环状流程图怎么画好看?5分钟让你精通绘制技巧
  9. css3 弹性盒模型 变化
  10. Visio—如何画矩形虚线边框?
  11. 【NLP】统计自然语言处理(第2版)思维导图
  12. 2022年帝国CMS7.5内核精仿《5288商机网》二次开发多个功能,运营级
  13. 让游戏沉浸感炸裂的实时3D音效技术原理与实践(上)
  14. win7 添加XP共享打印机
  15. 经典智力题:火车运煤
  16. 当年意气不肯平,白发如丝叹何益。贪心跳跃游戏
  17. 在AVD上运行程序时,程序闪退并报错unfortunately,xx has stopped
  18. 卡迪夫大数据专业排名_英国留学:英国大数据专业十大院校推荐!
  19. 浪潮服务器bios怎么找回密码,服务器BIOS密码丢失解决方法
  20. PUB/SUB Pattern-Oriented Software Architecture v1巨详细读书笔记 11

热门文章

  1. dijkstra algorithm example
  2. Android教程 第五章 常用UI界面控件
  3. wordpress元素查找PHP文件,小部件中的php按类获取元素(wordpress)
  4. java6可以玩儿我的世界吗_我的世界Java1.16预发行版6下载_我的世界Java1.16预发行版6官方游戏下载 v1.17.30.94571-菜鸟下载...
  5. python如何用requests传送json格式数据
  6. python反转数字_[蓝桥杯]使用列表反转的回文数(Python代码),数字,利用,取反
  7. dubbo service注解用法_dubbo学习(四)配置dubbo 注解方式配置
  8. 楚留香服务器维护时间,2019年06月28日官方维护公告
  9. Android手机使用Windows应用,微软宣布在你的手机应用上运行安卓APP功能向Windows 10稳定版提供...
  10. Openzepplin ERC-721中的函数