【BZOJ3238】【AHOI2013】差异
sam好,好写好调好ac!
原题:
图片题面好评

2<=N<=500000
在syq大神的指点下终于理解一道后缀自动姬了quq
(其实是因为这道题的dp主要是在后缀树(就是拓扑序)上搞树形dp……
恩sam有个好玩的东西呢就是搞出后缀自动姬后根据max搞一个类似与后缀数组中countrank的东西
这个就是自动姬的拓扑序,同时也是parent树的不知道什么序,反正如果倒叙遍历这个序列的话x一定会比father[x]先访问到就对了
然后就可以直接用countrank搞树形dp辣
每个树点对答案的贡献就是(max[x]-max[father[x]])*C_{|right[x]|}^{2}
写到这里我突然发现这个组合数不太理解啊,如果两个节点在同一个子节点的子树中怎么办……
一定是还有什么性质我没考虑到
syq回寝吃泡面了,只能回去问syq了quq
啊,syq吃完泡面后讲明白了quq
就像下面酱紫一个图:

在这个后缀树中,现在计算2节点对于答案的贡献
我本来的想法是如果直接用2的深度乘C_{子树大小}^{2}岂不是会出现两个节点在同一子节点的子树中然后重复计算的情况?
但是实际上在计算贡献的时候是用(max[x]-max[father[x]])乘组合数的,这个表示的是2和1之间的连边,而不是2的深度
2和1对答案的贡献显然就乘C_{子树大小}^{2}
这样就解决了Σlcp(i,j)*2的问题,至于前面那些东西,最后结果是(n+1)*(n-1)*n/2,请同学们自行推到 _(:3 」∠)_
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define ll long long
int rd(){int z=,mk=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')mk=-; ch=getchar();}
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z*mk;
}
char s[]; int n;
int nxt[][],fa[],mx[],sz[],sm[];
int lst=,tt=;
int cnt[],cntrk[];
void ist(int x){
int p=lst,np=lst=++tt;
mx[np]=mx[p]+; sz[np]=sm[np]=;
while(!nxt[p][x] && p) nxt[p][x]=np,p=fa[p];
if(!p) fa[np]=;
else{
int q=nxt[p][x];
if(mx[p]+==mx[q]) fa[np]=q;
else{
int nq=++tt; mx[nq]=mx[p]+;
memcpy(nxt[nq],nxt[q],sizeof(nxt[q]));
fa[nq]=fa[q]; fa[q]=fa[np]=nq;
while(nxt[p][x]==q) nxt[p][x]=nq,p=fa[p];
}
}
}
void gtcntrk(){
for(int i=;i<=tt;++i) ++cnt[mx[i]];
for(int i=;i<=n;++i) cnt[i]+=cnt[i-];
for(int i=tt;i;--i) cntrk[cnt[mx[i]]--]=i;
}
ll play(){
ll bwl=;
for(int i=tt;i;--i){
sz[fa[cntrk[i]]]+=sz[cntrk[i]];
/*bwl+=(ll)sm[fa[cntrk[i]]]*sz[cntrk[i]]*mx[fa[cntrk[i]]];
sm[fa[cntrk[i]]]+=sz[cntrk[i]];*/
bwl+=(ll)(mx[cntrk[i]]-mx[fa[cntrk[i]]])*sz[cntrk[i]]*(sz[cntrk[i]]-);
}
return bwl;
}
int main(){//freopen("ddd.in","r",stdin);
scanf("%s",s+); n=strlen(s+);
for(int i=;i<=n;++i) ist(s[i]-'a');
gtcntrk();
cout<<(ll)(n+)*n/*(n-)-play()<<endl;
return ;
}
【BZOJ3238】【AHOI2013】差异的更多相关文章
- BZOJ3238 [Ahoi2013]差异 【SAM or SA】
BZOJ3238 [Ahoi2013]差异 给定一个串,问其任意两个后缀的最长公共前缀长度的和 1.又是后缀,又是\(lcp\),很显然直接拿\(SA\)的\(height\)数组搞就好了,配合一下单 ...
- 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$和显然 ...
- [BZOJ3238][AHOI2013]差异(后缀数组)
求和式的前两项可以直接算,问题是对于每对i,j计算LCP. 一个比较显然的性质是,LCP(i,j)是h[rk[i]+1~rk[j]]中的最小值. 从h的每个元素角度考虑,就是对每个h计算有多少对i,j ...
- [BZOJ3238][Ahoi2013]差异解题报告|后缀数组
Description 先分析一下题目,我们显然可以直接算出sigma(len[Ti]+len[Tj])的值=(n-1)*n*(n+1)/2 接着就要去算这个字符串中所有后缀的两两最长公共前缀总和 首 ...
- BZOJ3238 [Ahoi2013]差异 【后缀数组 + 单调栈】
题目链接 BZOJ3238 题解 简单题 经典后缀数组 + 单调栈套路,求所有后缀\(lcp\) #include<iostream> #include<cstdio> #in ...
- BZOJ3238: [Ahoi2013]差异 (后缀自动机)
Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao Sample Output 54 HINT 2<=N< ...
- BZOJ3238 [Ahoi2013]差异
首先把后缀数组和height数组都搞出来... 然后用两个单调栈维护$[l, r]$表示对于一个点$x$,满足$height[x] \le height[l..x] \ \&\&\ ...
- bzoj千题计划314:bzoj3238: [Ahoi2013]差异(后缀数组+st表+单调栈)
https://www.lydsy.com/JudgeOnline/problem.php?id=3238 跟 bzoj3879 差不多 #include<cstdio> #include ...
- 2018.12.21 bzoj3238: [Ahoi2013]差异(后缀自动机)
传送门 后缀自动机好题. 题意: 做法:samsamsam 废话 考虑翻转字串,这样后缀的最长公共前缀等于前缀的最长公共后缀. 然后想到parentparentparent树上面两个串的最长公共后缀跟 ...
随机推荐
- 數據庫ORACLE轉MYSQL存儲過程遇到的坑~(總結)
ORACLE數據庫轉MySQL數據庫遇到的坑 總結 最近在做Oracle轉mysql的工程,遇到的坑是真的多,尤其是存儲過程,以前都沒接觸過類似的知識,最近也差不多轉完了就總結一下.希望能幫到一些人( ...
- 1014 2018 使用FLAG counter
AmazingCounters.com 不能用了,服务器访问不了了,之前的博客浏览量也看不到了,1014号换了个新的--FLAG counter,就是博客右边那个.
- Linux学习 : Socket 网络编程入门
一.socket()函数 int socket(int domain, int type, int protocol); domain:即协议域,又称为协议族(family).常用的协议族有,AF_I ...
- Centos7初始配置
配置 centos7 ip地址: vi /etc/sysconfig/network-scripts/ifcfg-ens33 BOOTPROTO=static ONBOOT=yes NM_CONTRO ...
- activiti 插件安装,以及初始化配置
1.安装插件 2.添加pom 3.配置activiti.cfg.xml 4.绘制业务流程图 MyProcess.bpmn 5.加载activiti数据表 6.创建流程 1.安装eclipse acti ...
- codeforces959C
题意:输入n(代表有n个节点),找出满足题意给出的找出最小节点数(对于给出的所有边,在这个最小节点数集合里总可以找到一个点在此边上). 给出算法: 1:根节点节点数为1; 2:计算所有深度为偶数的节点 ...
- 前端小白凭什么杀进 BAT?
七天国庆黄金周转眼即逝,退散的除了出游的热情,还有一波求职热潮...IT 行业的技术者,时常被称为“码农.IT民工” 虽然行业内巨大的人才需求和相对容易得到的高薪,在源源不断的吸引各路人马加入,但它依 ...
- 继承映射中的java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: person is not mapped [FROM person]
继承映射中查询对象的过程中报错: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxExcep ...
- 【转】Delphi 10.3关于相机该注意的细节
感谢移动信息化专家提供的方法,他的ChinaCock组件是相当的专业,感兴趣可以加入qq群223717588.
- ajax参考增删改查
AJAX做增删改查详细! <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "htt ...