先把问题放在后缀数组上考虑

已知两个数组a b,求min(a[i],...,a[j])+(b[i]^b[j])的最大值

套路题

初始每个点都是一个小连通块

把a按从大到小的顺序加入,计算当前加入边作为min的贡献:

每次加入会把两个连通块联通,答案就是两边连通块各出一个数能得到的异或和最大值

我:这不是线性基吗

miaom:mdzz,只能有两个数

我:蛤,好难啊,怎么做啊

miaom:Trie啊

我:哦

没了

 #include <bits/stdc++.h>
#define N 500001
#define MAX 18
using namespace std;
int NODE,n;char ch;
int a[N],b[N],c[N*MAX][],size[N],rt[N],lef[N];
pair<int,int> so[N];
int X[N],Y[N],SA[N],Rk[N],Ht[N],v[N];
void GetSA(int a[],int n,int m=)
{
int *x=X,*y=Y,i,p,j;
memset(v,,sizeof v);
for(i=;i<=n;i++)v[x[i]=a[i]]++;
for(i=;i<=m;i++)v[i]+=v[i-];
for(i=n;i>=;i--)SA[v[x[i]]--]=i;
for(i=;i<=n;i<<=,m=p)
{
p=;
memset(v,,sizeof v);
for(j=n-i+;j<=n;j++)y[++p]=j;
for(j=;j<=n;j++)if(SA[j]>i)y[++p]=SA[j]-i;
for(j=;j<=n;j++)v[x[y[j]]]++;
for(j=;j<=m;j++)v[j]+=v[j-];
for(j=n;j>=;j--)SA[v[x[y[j]]]--]=y[j];
swap(x,y);
p=;x[SA[]]=;
for(j=;j<=n;j++)
if(y[SA[j-]]==y[SA[j]]&&y[SA[j-]+i]==y[SA[j]+i]) x[SA[j]]=p;
else x[SA[j]]=++p;
if(p>=n)break;
}
}
void GetHt(int a[],int n)
{
int k=;
for(int i=;i<=n;i++)Rk[SA[i]]=i;
for(int i=;i<=n;i++)
{
if(k)k--;
int j=SA[Rk[i]-];
while(i+k<=n&&j+k<=n&&a[i+k]==a[j+k])k++;
Ht[Rk[i]]=k;
}
}
int build(int x)
{
int rt=++NODE,now=rt;
for(int i=MAX;i>=;i--)
c[now][(x>>i)&]=++NODE,now=NODE;
return rt;
}
int que(int x,int y,int z=)
{
int best=z;
if(c[x][])
if(c[y][]) best=que(c[x][],c[y][],z*+);
else best=que(c[x][],c[y][],z*);
if(c[x][])
if(c[y][]) best=max(best,que(c[x][],c[y][],z*+));
else best=max(best,que(c[x][],c[y][],z*));
return best;
}
void merge(int x,int y)
{
if(c[x][])
if(c[y][]) merge(c[x][],c[y][]);
else c[y][]=c[x][];
if(c[x][])
if(c[y][]) merge(c[x][],c[y][]);
else c[y][]=c[x][];
}
int getfa(int x)
{
if(lef[x]==x) return x;
else return lef[x]=getfa(lef[x]);
}
int main()
{
scanf("%d",&n);
for(ch=getchar();!isalpha(ch);ch=getchar());
for(int i=;i<=n;i++,ch=getchar())
a[i]=ch;
for(int i=;i<=n;i++)
scanf("%d",&b[i]);
GetSA(a,n);
GetHt(a,n);
for(int i=;i<=n;i++)
size[i]=,lef[i]=i,rt[i]=build(b[SA[i]]);
for(int i=;i<=n;i++)
so[i-]=make_pair(n-Ht[i],i);
sort(so+,so+n);
int ret=;
for(int i=;i<n;i++)
{
int x=so[i].second,y=x-,z=n-so[i].first;
x=getfa(x);y=getfa(y);
if(size[x]<size[y]) swap(x,y);
int bes=que(rt[y],rt[x])+z;
if(bes>ret)
ret=bes;
merge(rt[y],rt[x]);
size[x]+=size[y];
lef[y]=x;
}
printf("%d\n",ret);
return ;
}

loj6198谢特 后缀数组+并查集+Trie的更多相关文章

  1. BZOJ 4566 JZYZOJ 1547 [haoi2016T5]找相同子串 后缀数组 并查集

    http://172.20.6.3/Problem_Show.asp?id=1547 http://www.lydsy.com/JudgeOnline/problem.php?id=4566 单纯后缀 ...

  2. NOI 2015 品酒大会 (后缀数组+并查集)

    题目大意:略 40分暴力还是很好写的,差分再跑个后缀和 和 后缀最大值就行了 一种正解是后缀数组+并查集 但据说还有后缀数组+单调栈的高端操作蒟蒻的我当然不会 后缀数组求出height,然后从大到小排 ...

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

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

  4. Uva 12361 File Retrieval 后缀数组+并查集

    题意:有F个单词,1 <= F <=60 , 长度<=10^4, 每次可以输入一个字符串,所有包含该字串的单词会形成一个集合. 问最多能形成多少个不同的集合.集合不能为空. 分析:用 ...

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

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

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

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

  7. 4199. [NOI2015]品酒大会【后缀数组+并查集】

    Description 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 酒家”和“首席猎手”两个奖项,吸引了众多品酒师参加.在大会的晚餐上,调酒师 ...

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

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

  9. CF 452E. Three strings(后缀数组+并查集)

    传送门 解题思路 感觉这种题都是套路之类的??首先把三个串并成一个,中间插入一些奇怪的字符,然后跑遍\(SA\).考虑按照\(height\)分组计算,就是每个\(height\)只在最高位计算一次, ...

随机推荐

  1. css3立体旋转菜单

    css3立体旋转菜单,css3,3D,立体旋转,立体菜单,菜单导航,css3立体旋转菜单是一款纯css3实现的三维立体旋转导航菜单. 源码下载页:http://www.huiyi8.com/sc/71 ...

  2. POSTGRESQL 导入导出

    安装postgresql yum install postgresql postgresql-server mysql占用端口3306 pgsql是5432 2 导入整个数据库 psql -U pos ...

  3. IOC/DI控制反转与依赖注入

    IOC/DI控制反转与依赖注入 IOC和DI表现的效果的是一样的只不过对于作用的对象不同,有了不一样的名字. 先用一个现实的例子来说明IOC/DI表现出来的效果.

  4. hdu-5857 Median(水题)

    题目链接: Median Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  5. HDU5875Function(单调队列)

    The shorter, the simpler. With this problem, you should be convinced of this truth.      You are giv ...

  6. ACM学习历程—HDU 5326 Work(树形递推)

    Problem Description It’s an interesting experience to move from ICPC to work, end my college life an ...

  7. codevs 2144 砝码称重2

    传送门 2144 砝码称重 2  时间限制: 1 s  空间限制: 16000 KB  题目等级 : 钻石 Diamond 题解   题目描述 Description 有n个砝码,现在要称一个质量为m ...

  8. kindle 3 webbrowser破解,

    首先下载破解: http://183.60.157.10/down_group83/M00/06/31/tzydCk3MyHYAAAAAAUTLHFYI-wk8562757/webpatch.7z?k ...

  9. SpringMVC之六:Controller详细介绍

    一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Mo ...

  10. <正则吃饺子> :关于Collections中 比较器的简单使用

    在线文档地址: http://tool.oschina.net/apidocs/apidoc?api=jdk-zh sort public static <T extends Comparabl ...