博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【AHOI2013】【BZOJ3238】差异
阅读量:5025 次
发布时间:2019-06-12

本文共 1886 字,大约阅读时间需要 6 分钟。

Description

这里写图片描写叙述

Input

一行,一个字符串S

Output

一行。一个整数。表示所求值

Sample Input

cacao

Sample Output

54

HINT

2<=N<=500000,S由小写英文字母组成

后缀自己主动机的性质:

5.两个串的最长公共后缀,位于这两个串相应状态在Parent树上的近期公共祖先状态.

那么我们把原题里后缀的最长公共前缀反过来,把原串反过来建SAM就变成了最长公共后缀

然后题意就是求一个串全部前缀的最长公共后缀长度之和
我们能够在parent树上进行树形DP(按Po姐的说法事实上就是在后缀树上DP?)统计每一个点是多少点的LCA
对一个点统计子树两两right集合大小之积的和乘以深度
(别忘了是让你减掉这个东西)

#include
#include
#include
#include
#include
#define MAXN 1000100using namespace std;char ch[MAXN];int top;long long ans;struct edge{ int to; edge *next;}e[MAXN],*prev[MAXN];void insert(int u,int v){ e[++top].to=v;e[top].next=prev[u];prev[u]=&e[top];}struct sam{ int last,cnt,p,q,np,nq; int len[MAXN],fa[MAXN],a[MAXN][26],size[MAXN]; sam() { last=++cnt; } void insert(int c) { p=last;np=last=++cnt;len[np]=len[p]+1;size[np]=1; while (!a[p][c]&&p) a[p][c]=np,p=fa[p]; if (!p) fa[np]=1; else { q=a[p][c]; if (len[q]==len[p]+1) fa[np]=q; else { nq=++cnt;len[nq]=len[p]+1; memcpy(a[nq],a[q],sizeof(a[q])); fa[nq]=fa[q]; fa[q]=fa[np]=nq; while (a[p][c]==q) a[p][c]=nq,p=fa[p]; } } }}sam;void dfs(int x,int f){ for (edge *i=prev[x];i;i=i->next) { dfs(i->to,x); sam.size[x]+=sam.size[i->to]; } if (x==1) return; sam.len[x]-=sam.len[f]; ans-=(long long)sam.size[x]*(sam.size[x]-1)*sam.len[x];}int main(){ scanf("%s",ch);int Len=strlen(ch); for (int i=Len-1;i>=0;i--) sam.insert(ch[i]-'a'); ans=(long long)(Len-1)*Len*(Len+1)>>1; for (int i=2;i<=sam.cnt;i++) insert(sam.fa[i],i); dfs(1,0); cout<
<

转载于:https://www.cnblogs.com/brucemengbm/p/7041170.html

你可能感兴趣的文章
JSON 小记
查看>>
《Linux命令行与shell脚本编程大全 第3版》高级Shell脚本编程---06
查看>>
[1-4] 把时间当做朋友(李笑来)Chapter 4 【开拓我们的心智】 摘录
查看>>
redis数据过期策略【转】
查看>>
ASP.net MVC4 View设置Html代码显示为文本字符问题
查看>>
go语言之进阶篇关闭channel
查看>>
《那些年啊,那些事——一个程序员的奋斗史》——65
查看>>
opencv 内存溢出问题
查看>>
简单的静态网页(宠物网)
查看>>
HDU 5410(2015多校10)-CRB and His Birthday(全然背包)
查看>>
hdu 2874 Connections between cities(st&rmq LCA)
查看>>
【Linux基础学习之五】Linux管理命令的基础学习(df、du、free、kill、tar等)
查看>>
20171115
查看>>
求最长公共子串
查看>>
根据百度API获得经纬度,然后根据经纬度在获得城市信息
查看>>
强制客户端更新Silverlight XAP文件方法汇总(转)
查看>>
Android tabLayout+recyclerView实现锚点定位
查看>>
numpy.squeeze()的用法
查看>>
数字滤波器 C语言
查看>>
JAVA基础知识 String s = new String("ABC") VS String s = "abc"
查看>>