【AHOI2013】【BZOJ3238】差异
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<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAXN 1000100
using 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<<ans<<endl;
}
【AHOI2013】【BZOJ3238】差异的更多相关文章
- 【BZOJ3238】【AHOI2013】差异
sam好,好写好调好ac! 原题: 图片题面好评 2<=N<=500000 在syq大神的指点下终于理解一道后缀自动姬了quq (其实是因为这道题的dp主要是在后缀树(就是拓扑序)上搞树形 ...
- BZOJ 3238 【AHOI2013】 差异
题目链接:差异 写题时发现这道题当初已经用后缀数组写过了……但是既然学了后缀自动机那就再写一遍吧…… 观察一下题目所给的式子:\[\sum_{1\leqslant i < j \leqslant ...
- bzoj3238 差异
题目链接 思路 观察题目中的式子,可以发现前两项是定值.所以只需要求出最后一项就行了. 然后题目就转化为了求字符串中所有后缀的\(lcp\)长度之和. 可以想到用后缀数组.在后缀数组上两个后缀的\(l ...
- 【AHOI2013】差异
题面 题解 $ \because \sum_{1 \leq i < j \leq n} i + j = \frac{n(n-1)(n+1)}2 $ 所以只需求$\sum lcp(i,j)$即可. ...
- [bzoj3238]差异(后缀数组+单调栈)
显然我们可以先把len(Ti)+len(Tj)的值先算出来,再把LCP减去.所有len(Ti)+len(Tj)的值为n*(n-1)*(n+1)/2,这个随便在纸上画一画就可以算出来的. 接下来问题就是 ...
- 「AHOI2013」 差异
知识点: SA,线段树,单调栈 原题面 Loj Luogu 题意简述 给定一长度为 \(n\) 的字符串 \(S\),令 \(T_i\) 表示从第 \(i\) 个字符开始的后缀,求: \[\sum_{ ...
- 【BZOJ3238】[AHOI2013]差异
[BZOJ3238][AHOI2013]差异 题面 给定字符串\(S\),令\(T_i\)表示以它从第\(i\)个字符开始的后缀.求 \[ \sum_{1\leq i<j\leq n}len(T ...
- 【BZOJ3238】[Ahoi2013]差异 后缀数组+单调栈
[BZOJ3238][Ahoi2013]差异 Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao Sample Ou ...
- bzoj3238 [Ahoi2013]差异 后缀数组+单调栈
[bzoj3238][Ahoi2013]差异 Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao Sample Ou ...
- [bzoj3238][Ahoi2013]差异_后缀数组_单调栈
差异 bzoj-3238 Ahoi-2013 题目大意:求任意两个后缀之间的$LCP$的和. 注释:$1\le length \le 5\cdot 10^5$. 想法: 两个后缀之间的$LCP$和显然 ...
随机推荐
- chrome 获取移动端页面元素信息
一:背景在使用appium进行app端自动化测试的时候,一般使用的是uiautomatorviewer来给页面元素做定位.但如果遇到页面元素类型是webview的时候,则只能定位整个页面,而不能更进一 ...
- BZOJ 3530 [SDOI2014]数数 (Trie图/AC自动机+数位DP)
题目大意:略 裸的AC自动机+数位DP吧... 定义f[i][x][0/1]表示已经匹配到了第i位,当前位置是x,0表示没到上限,1到上限,此时数是数量 然而会出现虚拟前导零,即前几位没有数字的情况, ...
- jq 遍历 元素
$("#spec").find("div.gods-spe").each(function(i,n){ var child = $(this).children ...
- vux安装时报vux-loader配置问题
一.初始化:webpack 项目塔建: 使用vue-cli塔建基于webpack的vue环境.然后根据vux官网安装使用文档安装vux组件库及配置build/webpack.base.conf.js. ...
- C语言中头文件尖括号和引号的区别
用include 引用头文件时,双引号和尖括号的区别: 1.双引号:引用非标准库的头文件,编译器首先在程序源文件所在目录查找,如果未找到,则去系统默认目录查找,通常用于引用用户自定义的头文件. 2.尖 ...
- 常用Java开源库(新手必看)
Jakarta common: Commons LoggingJakarta Commons Logging (JCL)提供的是一个日志(Log)接口(interface),同时兼顾轻量级和不依赖于具 ...
- 洛谷 P2128 赤壁之战
P2128 赤壁之战 题目描述 赤壁之战,黄盖率舰满载薪草膏油诈降曹军. 受庞统所授的连环计,曹军战船之间由铁索相连,没有两艘战船在同一位置,也没有铁索两两相交或穿过战船.每艘船都有其一定的战略价值. ...
- cocos2dx2.0 与cocos2dx3.1 创建线程不同方式总结
尽管内容是抄过来的.可是经过了我的验证.并且放在一起就清楚非常多了,cocos2dx版本号常常变化非常大.总会导致这样那样的问题. cocos2dx2.0 中 1. 头文件 #include < ...
- [MST] Defining Asynchronous Processes Using Flow
In real life scenarios, many operations on our data are asynchronous. For example, because additiona ...
- Caused by: java.lang.ClassNotFoundException: com.njupt.libgdxbase.MainActivity
在使用libgdx来开发游戏时.假设遇到这样的问题.非常可能是由于你没有在libgdx的项目中导入Android的现骨干jar包导致的. 解决方法例如以下: 右击项目---"build pa ...