【题意】给定长度为n的小写字母字符串,令Ti表示以i开头的后缀,求Σ[Ti+Tj-2*lcp(Ti,Tj)],1<=i<j<=n。

【算法】后缀自动机

【题解】Σ(Ti+Tj)只与n有关,那么关键在于计算Σ2*lcp(Ti,Tj)。

对逆序串建后缀自动机,其parent树就是原串的后缀树,lcp(Ti,Tj)就是两个后缀在后缀树上的LCA。

那么每个节点的贡献是:2*C(Right(x),2)*Len(x),Right集合的计算先把所有的后缀节点(即每次的np)赋值为1,然后dfs即可。

也可以不用组合数,考虑实际意义——每个节点的贡献是:(Right(x)^2-ΣRight(y)^2)*Len(x),y=son(x),如果x自己是后缀节点括号里再-1,这是从每个Right要在此节点和其它Right结合的思想。

SAM记得双倍空间。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=1000010;//
struct tree{int len,fa,t[30];}t[maxn];
struct edge{int v,from;}e[maxn*2];
int last,n,tot=0,root,cnt,first[maxn];
ll f[maxn],ans=0;
bool mark[maxn];
char s[maxn];
void insert(int c){int np=++tot;t[np].len=t[last].len+1;f[np]=1;int x=last;while(x&&!t[x].t[c])t[x].t[c]=np,x=t[x].fa;last=np;if(!x)t[np].fa=root;else{int y=t[x].t[c];if(t[y].len==t[x].len+1)t[np].fa=y;else{int nq=++tot;t[nq]=t[y];t[nq].len=t[x].len+1;t[nq].fa=t[y].fa;t[y].fa=t[np].fa=nq;while(x&&t[x].t[c]==y)t[x].t[c]=nq,x=t[x].fa;}}
}
void ins(int u,int v){cnt++;e[cnt].v=v;e[cnt].from=first[u];first[u]=cnt;}
void dfs(int x){ll sum=f[x]*f[x];for(int i=first[x];i;i=e[i].from){dfs(e[i].v);f[x]+=f[e[i].v];sum+=f[e[i].v]*f[e[i].v];}ans+=(f[x]*f[x]-sum)*t[x].len;
}
int main(){scanf("%s",s+1);n=strlen(s+1);root=tot=last=1;for(int i=n;i>=1;i--)insert(s[i]-'a');for(int i=2;i<=tot;i++)ins(t[i].fa,i);dfs(root);ll sum=0;for(int i=1;i<n;i++){sum+=1ll*(n-i)*(n-i+1)*3/2;}printf("%lld",sum-ans);return 0;
}

View Code

转载于:https://www.cnblogs.com/onioncyc/p/8124077.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】差异

    传送门~ 解题思路 求后缀数组以后搞个单调栈. 因为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. DirectX11 SDK下载地址:
  2. MyBatis简介与配置MyBatis+Spring+MySql
  3. vue实现原理解析及一步步实现vue框架
  4. error和exception
  5. git+pylint实现python提交代码格式校验
  6. JS检测浏览器是否最大化
  7. java运行python脚本_java调用python脚本,中文变成问号
  8. C#等同于正则表达式的写法
  9. Eclipse更改字体大小
  10. 微信小程序 选项卡demo
  11. Linux内核学习1——Linux内核编译安装
  12. matlab 7.0 win8,Win8.1系统中matlab7.0不兼容的解决方法
  13. zephyr如何添加pwm支持
  14. Linux环境下安装MySQL(源码安装)
  15. busybox文件系统与简单驱动学习(4)-RT3070无线网卡STA模式配置
  16. 计算机网络与无线通信系统学习6:路由器基础
  17. Makefile 文件的编写
  18. (PG\SE\SSE\PL\PM\PD\UI\QA等)软件行业人员职位缩写或简称以及职责划分
  19. C# TCP/UDP网络通讯调试助手(含源码)
  20. 在b站上跟着沐神学习深度学习

热门文章

  1. Java的JDK以及maven环境变量配置
  2. 递归 人理解循环 神理解递归
  3. Using OpenCV Java with Eclipse
  4. Html 小插件4 百度搜索代码
  5. 本示例主要展示如何在XtraGrid网格控件(包含在DevExpress WinForms套包中)的主视图中指定HyperLinkEdit控件作为列编辑器...
  6. 一个可以实时查相关电子产品价格的网站
  7. POJ 3984 迷宫问题 (Dijkstra)
  8. oracle把ascii吗,oracle中ascii函数及to_char函数使用及编码间的转换
  9. php pdo mysql类源码_完整示例php+pdo实现的购物车类
  10. ajax返回功能,jquery – 记得ajax在点击返回按钮时添加的数据