博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ4199】[Noi2015]品酒大会 后缀数组+并查集
阅读量:5030 次
发布时间:2019-06-12

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

【BZOJ4199】[Noi2015]品酒大会

题面

题解:听说能用SAM?SA默默水过~

本题的实现还是非常简单的,先求出height数组,然后两杯酒'r'相似就等价于二者中间的height都>=r,于是我们将height排序,从大到小扔进去,那么所有连续的区间中的点对就都是相似的了。维护连续区间可以用并查集。统计点对个数需要维护size,统计最大乘积需要维护最(次)大(小)值,然后没了~

#include 
#include
#include
#include
using namespace std;const int maxn=300010;int n,m;typedef long long ll;int sa[maxn],st[maxn],ra[maxn],rb[maxn],r[maxn],h[maxn],rank[maxn];int f[maxn],q[maxn],v[maxn];ll ans[maxn],sum[maxn],m1[maxn],m2[maxn],n1[maxn],n2[maxn],siz[maxn];char str[maxn];void work(){ int i,j,p,k,*x=ra,*y=rb; for(i=0;i
=0;i--) sa[--st[x[i]]]=i; for(j=p=1;p
<<=1,m=p) { for(p=0,i=n-j;i
=j) y[p++]=sa[i]-j; for(i=0;i
=0;i--) sa[--st[x[y[i]]]]=y[i]; for(swap(x,y),x[sa[0]]=0,i=p=1;i
h[b];}int main(){ scanf("%d%s",&n,str); int i,j,a,b; for(i=0;i
=0;j--) { ans[j]=ans[j+1],sum[j]=sum[j+1]; for(;h[q[i]]==j&&i<=n;i++) { a=find(q[i]-1),b=find(q[i]); if(m1[a]>m1[b]) m2[b]=max(m1[b],m2[a]),m1[b]=m1[a]; else m2[b]=max(m2[b],m1[a]); if(n1[a]

 

转载于:https://www.cnblogs.com/CQzhangyu/p/6953357.html

你可能感兴趣的文章
简化工作流程 10款必备的HTML5开发工具
查看>>
c++ 调用外部程序exe-ShellExecuteEx
查看>>
Java进击C#——语法之知识点的改进
查看>>
IdentityServer流程图与相关术语
查看>>
BirdNet: a 3D Object Detection Framework from LiDAR information
查看>>
icon fonts入门
查看>>
【Django】如何按天 小时等查询统计?
查看>>
HDU2191(多重背包)
查看>>
测试用例(一)
查看>>
【转】 mysql反引号的使用(防冲突)
查看>>
邮件中的样式问题
查看>>
AJAX 状态值与状态码详解
查看>>
php面向对象编程(oop)基础知识示例解释
查看>>
1.在数组中找到与给定总和的配对
查看>>
树的子结构
查看>>
关于根据Build Platform或者OS 加载x86或者x64 dll的问题
查看>>
程序员高效开发的几个技巧
查看>>
js-权威指南学习笔记19.2
查看>>
hexo 搭建博客
查看>>
关于 UIWebView 几个高级用法
查看>>