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

已知两个数组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. BZOJ 1208 [HNOI2004]宠物收养所:Splay(伸展树)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1208 题意: 有一个宠物收养所,在接下来一段时间内会陆续有一些宠物进到店里,或是一些人来领 ...

  2. jsonp跨域请求,动态script标签实现跨域

    1.什么是跨域 首先一个域名地址的组成是: http://www.xxx.com:8080/xxx/xxx.jsp 协议子域名主域名端口号请求资源地址 当协议.子域名.主域名.端口号中任意一个不相同时 ...

  3. str_1.判断两个字符串每个字符出现的次数一样

    1.两个字符串每个字符出现的次数一样 $str1 = "ab'c4*"; $str2 = "cb*'a4"; $ret = isBX($str1, $str2) ...

  4. 解决Linux Kettle出现闪退问题

    linux环境, 运行sh spoon.sh打开图形化界面时经常出现闪退情况. 报错信息如下: cfgbuilder - Warning: The configuration parameter [o ...

  5. Nginx均衡负载配置

    前言:Nginx也是一种服务器,反向代理服务器.单一tomcat能承受的并发访问量在150-200之间,还是在比较理想的情况下,当并发量超出这个范围,便需要Nginx实现多个tomcat的均衡负载,但 ...

  6. python之网络编程(概述及SOCKET)

    概述(TCP/IP协议是一个协议族): TCP/IP 协议按照四层怎么划分:链路层,网络层,传输层,应用层(实际上是四层) TCP/IP 协议按照七层怎么划分:物理层,数据链路层,网络层,传输层,会话 ...

  7. 每天一个Linux命令:目录

    版权声明 更新:2017-04-19博主:LuckyAlan联系:liuwenvip163@163.com声明:吃水不忘挖井人,转载请注明出处! 1 文章介绍 在使用Linux的过程中总是发现有一些L ...

  8. Katalon Recorder 自动录制 Selenium 爬虫脚本

    相信很多小伙伴都用过 Selenium 来完成爬虫工作,今天就给大家带来一个神器,可以录制你的浏览器动作,然后直接生成 Selenium 脚本,是不是心动了? 1 Selenium 简介 Seleni ...

  9. Mysql误删了root用户怎么办

    1.停止mysql服务:在mysql安装目录下找到my.ini:在my.ini中找到以下片段[mysqld]:另起一行加入代码:skip-grant-tables 并保存 2.启动mysql服务,并登 ...

  10. BZOJ4889:[TJOI2017]不勤劳的图书管理员

    浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html 题目传送门:https://www.lydsy.com/JudgeOnline/prob ...