自己尝试敲后缀数组,发现难看(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品酒大会 后缀数组的更多相关文章

  1. BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]

    4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...

  2. [UOJ#131][BZOJ4199][NOI2015]品酒大会 后缀数组 + 并查集

    [UOJ#131][BZOJ4199][NOI2015]品酒大会 试题描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个 ...

  3. 【BZOJ4199】[Noi2015]品酒大会 后缀数组+并查集

    [BZOJ4199][Noi2015]品酒大会 题面:http://www.lydsy.com/JudgeOnline/wttl/thread.php?tid=2144 题解:听说能用SAM?SA默默 ...

  4. [NOI2015] 品酒大会 - 后缀数组,并查集,STL,启发式合并

    [NOI2015] 品酒大会 Description 对于每一个 \(i \in [0,n)\) 求有多少对后缀满足 LCP 长度 \(\le i\) ,并求满足条件的两个后缀权值乘积的最大值. So ...

  5. BZOJ 4199: [Noi2015]品酒大会( 后缀数组 + 并查集 )

    求出后缀数组后, 对height排序, 从大到小来处理(r相似必定是0~r-1相似), 并查集维护. 复杂度O(NlogN + Nalpha(N)) ------------------------- ...

  6. BZOJ.4199.[NOI2015]品酒大会(后缀数组 单调栈)

    BZOJ 洛谷 后缀自动机做法. 洛谷上SAM比SA慢...BZOJ SAM却能快近一倍... 显然只需要考虑极长的相同子串的贡献,然后求后缀和/后缀\(\max\)就可以了. 对于相同子串,我们能想 ...

  7. 【学术篇】NOI2015 品酒大会 后缀数组+并查集

    省选前大致是刷不了几道题了... 所以就找一些裸一点的题目练练板子算了= = 然而这题一点都不裸, 也并不怎么好写... 于是就浪费了将近一下午的时间... 然而还不是因为后缀数组板子不熟= = 首先 ...

  8. luoguP2178 [NOI2015]品酒大会(后缀数组做法)

    题意 因为一个\(k\)相似必定为\(k-1,k-2....0\)相似,对于一个\(lcp\)为\(k\)后缀对\((i,j)\),我们只用把它的贡献加在\(k\)的答案上,最后求一个后缀和和后缀ma ...

  9. 【BZOJ-4199】品酒大会 后缀数组 + 并查集合并集合

    4199: [Noi2015]品酒大会 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 436  Solved: 243[Submit][Status] ...

随机推荐

  1. 截取带HTML标签的文本并保留文本样式

    一个截取HTML文本的工具,可以按照文字字数或文字字节长度进行截取,保留HTML样式并在最后自动补齐截取后的标签.按工作要求编写,时间紧迫,代码未优化,欢迎讨论和指正.​1. [文件] SubHtml ...

  2. jenkins maven tomcat做持续集成

    maven 采用 maven 3.0以上的版本.tomcat 采用 tomcat 7.0 以上的版本 1. tomcat 配置用户账号和权限 tomcat-users.xml <role rol ...

  3. Centos7配置https,及多个https配置

    Centos7.2配置https,及多个https配置 1.单个https配置 检查相关依赖,如果没有就yum安装 yum install mod_ssl openssl rpm -qa| grep ...

  4. HDU 6170 Two strings (dp)

    /** * 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6170 * 字符串match, '.'代表匹配任意一个字符,"*" 代表 ...

  5. T61

    你参加了这次科学讨论会,有什么体会?What have you learned from the symposium?那墙有点斜.The wall is a little out of the per ...

  6. hdu-5806 NanoApe Loves Sequence Ⅱ(尺取法)

    题目链接: NanoApe Loves Sequence Ⅱ Time Limit: 4000/2000 MS (Java/Others)     Memory Limit: 262144/13107 ...

  7. hdu-5784 How Many Triangles(计算几何+极角排序)

    题目链接: How Many Triangles Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  8. python读文件出现中文乱码

    更新: 一个解释更详细和全面的博文:https://www.cnblogs.com/zhangqigao/p/6496172.html 最近开始处理中文文本,读取文件有时候会出现乱码.原因:编码和解码 ...

  9. BZOJ_3159_决战

    题目链接 分析: 我使用树剖+splay维护这个东西. 对每条重链维护一棵splay,链加和查询正常做,剩下的链反转如下. 由于一定是深度递增的一条链,我们树剖将它分成从左到右log个区间,提取出对应 ...

  10. 第十二章: 部署Django

    本章包含创建一个django程序最必不可少的步骤 在服务器上部署它 如果你一直跟着我们的例子做,你可能正在用runserver 但是runserver 要部署你的django程序,你需要挂接到工业用的 ...