【题意】给定长度为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=;//
struct tree{int len,fa,t[];}t[maxn];
struct edge{int v,from;}e[maxn*];
int last,n,tot=,root,cnt,first[maxn];
ll f[maxn],ans=;
bool mark[maxn];
char s[maxn];
void insert(int c){
int np=++tot;
t[np].len=t[last].len+;
f[np]=;
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+)t[np].fa=y;else{
int nq=++tot;
t[nq]=t[y];
t[nq].len=t[x].len+;
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+);n=strlen(s+);
root=tot=last=;
for(int i=n;i>=;i--)insert(s[i]-'a');
for(int i=;i<=tot;i++)ins(t[i].fa,i);
dfs(root);
ll sum=;
for(int i=;i<n;i++){
sum+=1ll*(n-i)*(n-i+)*/;
}
printf("%lld",sum-ans);
return ;
}

最新文章

  1. Quartz.net持久化与集群部署开发详解
  2. linux中redis的主从
  3. tp框架之Model类与命名空间
  4. 使用js倒计时还有几天及计时过了几天
  5. 问题解决_WCF_WCF 接收我服务的 HTTP 响应时发生错误
  6. lifecycle of opensource products--x86-64
  7. 获取Android studio中的SHA1
  8. RabbitMQ (两)工作队列
  9. iOS中 HTTP/Socket/TCP/IP通信协议详解 韩俊强的博客
  10. windows 重写调试输出
  11. 结合JDK源码看设计模式——迭代器模式
  12. 接口自动化测试遭遇问题,excel中取出来的json串,无法使用requests去请求解决办法
  13. Python运维开发基础06-语法基础【转】
  14. 数据特征分析:3.统计分析 &amp; 帕累托分析
  15. hashMap之jdk1.7和jdk1.8
  16. 4.2计算字符的ASCII碼
  17. Promise实例的then方法
  18. Python&#160;基于python实现的http接口自动化测试框架(含源码)
  19. 20155308《信息安全系统设计基础 嵌入式C语言课堂考试补博客
  20. JDK7的新玩具java.util.Objects

热门文章

  1. Linux安装weblogic
  2. VC++调试基础
  3. zabbix简介
  4. mysql的程序组成
  5. PAT 甲级 1041 Be Unique
  6. 第87天:HTML5中新选择器querySelector的使用
  7. WPF中Image控件的Source属性的设置
  8. BZOJ5011 JXOI2017颜色(主席树)
  9. 【bzoj1878】[SDOI2009]HH的项链
  10. redis的Pub/Sub功能