NOI2015品酒大会 后缀数组
自己尝试敲后缀数组,发现难看(tiao)的不行,于是抄了板子
考虑建出hei以后转化出的问题:
对于一个数组中权值大于等于k的连续部分,求取两个数的方案数和两数积的最大值
(好气啊,可以有负数)
把询问倒序以后相当于连续部分之间会动态加元素,使他们连起来
维护一段极大连续段的最大值、最小值、长度,保存在左右两端——wtf我也不知道这算什么做法
然后瞎**乱搞一下,就能每次合并O(1)维护出来了(似乎没比并查集好多少)
#include <bits/stdc++.h>
#define N 300001
#define MIN -9223372036854775807
#define calc(x) (x)*((x)-1)/2
#define ll long long
using namespace std;
ll n,ans,ans2;
ll c[N],mi[N],ma[N],len[N],w[N];
ll sa[N],Rank[N],height[N];
ll wa[N],wb[N],wv[N],wd[N];
ll out1[N],out2[N];
struct node
{
ll x,y;
node(ll p,ll q)
{
x=p;y=q;
}
node()
{
}
} t[N];
bool cmp(ll *r,ll a,ll b,ll l)
{
return r[a]==r[b]&&r[a+l]==r[b+l];
}
bool com(node a,node b)
{
return a.x>b.x;
}
void da(ll *r,ll n,ll m)
{
ll *x=wa,*y=wb,*t;
for (ll i=;i<m;i++) wd[i]=;
for (ll i=;i<n;i++) wd[x[i]=r[i]]++;
for (ll i=;i<m;i++) wd[i]+=wd[i-];
for (ll i=n-;i>=;i--) sa[--wd[x[i]]]=i;
for (ll j=,p=,i;p<n;j<<=,m=p)
{
for (p=,i=n-j;i<n;i++) y[p++]=i;
for (i=;i<n;i++) if (sa[i]>=j) y[p++]=sa[i]-j;
for (i=;i<n;i++) wv[i]=x[y[i]];
for (i=;i<m;i++) wd[i]=;
for (i=;i<n;i++) wd[wv[i]]++;
for (i=;i<m;i++) wd[i]+=wd[i-];
for (i=n-;i>=;i--) sa[--wd[wv[i]]]=y[i];
for (t=x,x=y,y=t,p=,x[sa[]]=,i=;i<n;i++)
x[sa[i]]=cmp(y,sa[i-],sa[i],j)?p-:p++;
}
}
void get_height(ll *r,ll n)
{
for (ll i=;i<=n;i++) Rank[sa[i]]=i;
for (ll i=,k=,j;i<n;height[Rank[i++]]=k)
for (k?k--:,j=sa[Rank[i]-];r[i+k]==r[j+k];k++);
}
void merge(ll x,ll y)
{
if(!len[x] || !len[y]) return;
ans2+=calc(len[x]+len[y]+)-calc(len[x]+)-calc(len[y]+);
ans=max(ans,w[sa[x-len[x]]]*mi[y]);ans=max(ans,mi[x]*mi[y]);
ans=max(ans,w[sa[x-len[x]]]*ma[y]);ans=max(ans,ma[x]*ma[y]);
ll MI=min(mi[x],mi[y]),MA=max(ma[x],ma[y]);
mi[x-len[x]+]=mi[y+len[y]-]=MI;
ma[x-len[x]+]=ma[y+len[y]-]=MA;
len[x-len[x]+]=len[y+len[y]-]=len[x]+len[y];
}
void add(ll now)
{
if(!now) return;
len[now]=;
mi[now]=ma[now]=w[sa[now]];
ans=max(ans,w[sa[now]]*w[sa[now-]]);
++ans2;
if(now)
merge(now-,now);
if(now<n-)
merge(now,now+);
}
int main()
{
scanf("%lld",&n);
for(ll i=;i<n;i++)
{
char ch;
while(ch=getchar(),!isalpha(ch));
c[i]=ch-'a'+;
}
for(ll i=;i<n;i++)
scanf("%lld",&w[i]);
c[n]=;
da(c,n+,);
get_height(c,n);
for(ll i=;i<n;i++)
sa[i]=sa[i+],height[i]=height[i+];
if()
for(ll i=;i<n;i++)
{
printf("%lld %lld\n",sa[i],height[i]);
}
for(ll i=;i<n;i++)
t[i]=node(height[i],i);
sort(t,t+n,com);
ll j=;
ans=MIN;ans2=;
for(ll i=;i<n;i++)
len[i]=,ma[i]=MIN,mi[i]=-MIN;
for(ll i=n-;i>=;i--)
{
while(j<n && t[j].x==i) add(t[j].y),j++;
out1[i]=ans2;out2[i]=(ans==MIN)?:ans;
}
for(ll i=;i<n;i++)
printf("%lld %lld\n",out1[i],out2[i]);
return ;
}
NOI2015品酒大会 后缀数组的更多相关文章
- BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]
4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...
- [UOJ#131][BZOJ4199][NOI2015]品酒大会 后缀数组 + 并查集
[UOJ#131][BZOJ4199][NOI2015]品酒大会 试题描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个 ...
- 【BZOJ4199】[Noi2015]品酒大会 后缀数组+并查集
[BZOJ4199][Noi2015]品酒大会 题面:http://www.lydsy.com/JudgeOnline/wttl/thread.php?tid=2144 题解:听说能用SAM?SA默默 ...
- [NOI2015] 品酒大会 - 后缀数组,并查集,STL,启发式合并
[NOI2015] 品酒大会 Description 对于每一个 \(i \in [0,n)\) 求有多少对后缀满足 LCP 长度 \(\le i\) ,并求满足条件的两个后缀权值乘积的最大值. So ...
- BZOJ 4199: [Noi2015]品酒大会( 后缀数组 + 并查集 )
求出后缀数组后, 对height排序, 从大到小来处理(r相似必定是0~r-1相似), 并查集维护. 复杂度O(NlogN + Nalpha(N)) ------------------------- ...
- BZOJ.4199.[NOI2015]品酒大会(后缀数组 单调栈)
BZOJ 洛谷 后缀自动机做法. 洛谷上SAM比SA慢...BZOJ SAM却能快近一倍... 显然只需要考虑极长的相同子串的贡献,然后求后缀和/后缀\(\max\)就可以了. 对于相同子串,我们能想 ...
- 【学术篇】NOI2015 品酒大会 后缀数组+并查集
省选前大致是刷不了几道题了... 所以就找一些裸一点的题目练练板子算了= = 然而这题一点都不裸, 也并不怎么好写... 于是就浪费了将近一下午的时间... 然而还不是因为后缀数组板子不熟= = 首先 ...
- luoguP2178 [NOI2015]品酒大会(后缀数组做法)
题意 因为一个\(k\)相似必定为\(k-1,k-2....0\)相似,对于一个\(lcp\)为\(k\)后缀对\((i,j)\),我们只用把它的贡献加在\(k\)的答案上,最后求一个后缀和和后缀ma ...
- 【BZOJ-4199】品酒大会 后缀数组 + 并查集合并集合
4199: [Noi2015]品酒大会 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 436 Solved: 243[Submit][Status] ...
随机推荐
- 截取带HTML标签的文本并保留文本样式
一个截取HTML文本的工具,可以按照文字字数或文字字节长度进行截取,保留HTML样式并在最后自动补齐截取后的标签.按工作要求编写,时间紧迫,代码未优化,欢迎讨论和指正.1. [文件] SubHtml ...
- jenkins maven tomcat做持续集成
maven 采用 maven 3.0以上的版本.tomcat 采用 tomcat 7.0 以上的版本 1. tomcat 配置用户账号和权限 tomcat-users.xml <role rol ...
- Centos7配置https,及多个https配置
Centos7.2配置https,及多个https配置 1.单个https配置 检查相关依赖,如果没有就yum安装 yum install mod_ssl openssl rpm -qa| grep ...
- HDU 6170 Two strings (dp)
/** * 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6170 * 字符串match, '.'代表匹配任意一个字符,"*" 代表 ...
- T61
你参加了这次科学讨论会,有什么体会?What have you learned from the symposium?那墙有点斜.The wall is a little out of the per ...
- hdu-5806 NanoApe Loves Sequence Ⅱ(尺取法)
题目链接: NanoApe Loves Sequence Ⅱ Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/13107 ...
- hdu-5784 How Many Triangles(计算几何+极角排序)
题目链接: How Many Triangles Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- python读文件出现中文乱码
更新: 一个解释更详细和全面的博文:https://www.cnblogs.com/zhangqigao/p/6496172.html 最近开始处理中文文本,读取文件有时候会出现乱码.原因:编码和解码 ...
- BZOJ_3159_决战
题目链接 分析: 我使用树剖+splay维护这个东西. 对每条重链维护一棵splay,链加和查询正常做,剩下的链反转如下. 由于一定是深度递增的一条链,我们树剖将它分成从左到右log个区间,提取出对应 ...
- 第十二章: 部署Django
本章包含创建一个django程序最必不可少的步骤 在服务器上部署它 如果你一直跟着我们的例子做,你可能正在用runserver 但是runserver 要部署你的django程序,你需要挂接到工业用的 ...