后缀自动机的parent树就是反串的后缀树。

所以只需要反向构建出后缀树,就可以乱搞了。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define ll long long
#define maxn 1000005 struct sam{
ll ans;
char s[maxn];
int cnt,last,siz[maxn],len;
int go[maxn][26],fa[maxn],l[maxn];
int h[maxn],to[maxn],ne[maxn],en;
void addedge(int a,int b)
{to[en]=b;ne[en]=h[a];h[a]=en++;}
void init()
{
cnt=last=1;
memset(go,0,sizeof go);
}
void add(int x)
{
// printf("add %d\n",x);
int p=last,np=last=++cnt;l[np]=l[p]+1;//printf("np is %d\n",np);
for (;p&&!go[p][x];p=fa[p]) go[p][x]=np;
if (!p) fa[np]=1;
else
{
int q=go[p][x];
if (l[q]==l[p]+1) fa[np]=q;
else
{
int nq=++cnt; l[nq]=l[p]+1; //printf("nq is %d\n",nq);
memcpy(go[nq],go[q],sizeof go[q]);
fa[nq]=fa[q];
fa[np]=fa[q]=nq;
for (;p&&go[p][x]==q;p=fa[p]) go[p][x]=nq;
}
}
siz[np]=1;
// printf("siz %d is %d\n",np,1);
}
void read()
{
scanf("%s",s+1); len=strlen(s+1);
D(i,len,1) add(s[i]-'a');
}
void dfs(int o)
{
// printf("dfs on %d len is %d\n",o,l[o]);
for (int i=h[o];i>=0;i=ne[i])
{ dfs(to[i]);
// printf("%d & %d -= %lld\n",o,to[i],(ll)2*siz[o]*siz[to[i]]*l[o]);
ans-=(ll)2*siz[o]*siz[to[i]]*l[o];
siz[o]+=siz[to[i]];
}
}
void work()
{
ans=(ll)(len-1)*(len+1)*len/2;
dfs(1);
printf("%lld\n",ans);
}
void build()
{
en=0;
memset(h,-1,sizeof h);
F(i,1,cnt) addedge(fa[i],i);
}
}SAM; int main()
{
SAM.init();
SAM.read();
SAM.build();
SAM.work();
}

  

最新文章

  1. C#中的接口
  2. 一个Chrome拓展——HttpPost
  3. xcode 自定义include路径
  4. JavaScript、Jquery选择题
  5. nodeschool.io 2
  6. Fix: Compile project encounter undefined reference to&ldquo;xxx&rdquo;error
  7. FMS4中的P2P功能
  8. iOS学习——iOS 整体框架及类继承框架图
  9. include指令和include动作
  10. 网络流 P3358 最长k可重区间集问题
  11. Unity安卓打包遇到的问题。
  12. Atom使用
  13. jenkins+git+maven 增量部署思路以及相关脚本
  14. python-面向对象-05_面向对象封装案例 II
  15. (路-莫)-Python基础一
  16. nginx location 正则匹配
  17. 个推基于 Apache Pulsar 的优先级队列方案
  18. JavaSE(二)之继承、封装、多态
  19. std::string,std::vector,std::accumulate注意事项
  20. hibernate的多对多配置

热门文章

  1. Java、Node.js、PHP还是.Net? 无论你选谁,我都能教你一招!
  2. ajax上传文件以及使用中常见问题处理
  3. COGS 1427. zwei
  4. 洛谷 P2347 砝码称重 != codevs 2144
  5. Mybatis-Generator逆向生成Po,Mapper,XMLMAPPER(idea)
  6. Linux Device Driver 学习(1)
  7. CPP-基础:C++的new int()与new int[]
  8. CPP-基础:内部函数应该在当前源文件中说明和定义
  9. VIM C语言函数名高亮
  10. jquery的同步和异步