BZOJ 3238 [Ahoi2013]差异 ——后缀自动机
2024-08-30 10:21:53
后缀自动机的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();
}
最新文章
- C#中的接口
- 一个Chrome拓展——HttpPost
- xcode 自定义include路径
- JavaScript、Jquery选择题
- nodeschool.io 2
- Fix: Compile project encounter undefined reference to&ldquo;xxx&rdquo;error
- FMS4中的P2P功能
- iOS学习——iOS 整体框架及类继承框架图
- include指令和include动作
- 网络流 P3358 最长k可重区间集问题
- Unity安卓打包遇到的问题。
- Atom使用
- jenkins+git+maven 增量部署思路以及相关脚本
- python-面向对象-05_面向对象封装案例 II
- (路-莫)-Python基础一
- nginx location 正则匹配
- 个推基于 Apache Pulsar 的优先级队列方案
- JavaSE(二)之继承、封装、多态
- std::string,std::vector,std::accumulate注意事项
- hibernate的多对多配置
热门文章
- Java、Node.js、PHP还是.Net? 无论你选谁,我都能教你一招!
- ajax上传文件以及使用中常见问题处理
- COGS 1427. zwei
- 洛谷 P2347 砝码称重 != codevs 2144
- Mybatis-Generator逆向生成Po,Mapper,XMLMAPPER(idea)
- Linux Device Driver 学习(1)
- CPP-基础:C++的new int()与new int[]
- CPP-基础:内部函数应该在当前源文件中说明和定义
- VIM C语言函数名高亮
- jquery的同步和异步