传送门

建出后缀数组按照heightheightheight合并连通块
维护01Trie01Trie01Trie合并,启发式询问即可

#include<bits/stdc++.h>
using namespace std;
const int RLEN=(1<<20)|5;
inline char gc(){static char ibuf[RLEN],*ib,*ob;(ib==ob)&&(ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));return (ib==ob)?EOF:*ib++;
}
#define gc getchar
inline int read(){char ch=gc();int res=0,f=1;while(!isdigit(ch))f^=ch=='-',ch=gc();while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=gc();return f?res:-res;
}
#define pb push_back
#define re register
#define fi first
#define se second
#define pii pair<int,int>
#define cs const
#define bg begin
#define ll long longtemplate<class tp>inline void chemx(tp &a,tp b){a<b?a=b:0;}
template<class tp>inline void chemn(tp &a,tp b){a>b?a=b:0;}
cs int N=100005;
char xxx;
namespace Trie{cs int M=N*30;int tot,son[M][2],siz[M];void insert(int &u,int k,int dep){if(!u)u=++tot;siz[u]++;if(dep<0)return;insert(son[u][(k>>dep)&1],k,dep-1);}int query(int &u,int k,int dep){if(dep<0)return 0;int t=(k>>dep)&1;if(siz[son[u][t^1]])return (1<<dep)+query(son[u][t^1],k,dep-1);else return query(son[u][t],k,dep-1);}void merge(int &u,int r1,int r2){if(!r1||!r2){u=r1+r2;return;}u=r1,siz[u]=siz[r1]+siz[r2];merge(son[u][0],son[r1][0],son[r2][0]);merge(son[u][1],son[r1][1],son[r2][1]);}
}
int ans;
namespace Sa{int sa[N],sa2[N],s[N],rk[N],buc[N],ht[N];int n,m;inline void buc_sort(){for(int i=1;i<=m;i++)buc[i]=0;for(int i=1;i<=n;i++)buc[rk[sa2[i]]]++;for(int i=1;i<=m;i++)buc[i]+=buc[i-1];for(int i=n;i>=1;i--)sa[buc[rk[sa2[i]]]--]=sa2[i];}inline void build(char *ss,int _n){n=_n;m=27;for(int i=1;i<=n;i++)s[i]=ss[i]-'a'+1,rk[i]=s[i],sa2[i]=i;buc_sort();for(int pos=0,i=1;i<=n&&pos<n;i<<=1){pos=0;for(int j=n-i+1;j<=n;j++)sa2[++pos]=j;for(int j=1;j<=n;j++)if(sa[j]>i)sa2[++pos]=sa[j]-i;buc_sort();swap(rk,sa2);pos=1,rk[sa[1]]=1;for(int j=2;j<=n;j++)rk[sa[j]]=(sa2[sa[j]]==sa2[sa[j-1]]&&sa2[sa[j]+i]==sa2[sa[j-1]+i])?pos:++pos;m=pos;}for(int i=1,j,k=0;i<=n;ht[rk[i++]]=k)for(k?k--:0,j=sa[rk[i]-1];s[j+k]==s[i+k];k++);}int fa[N],rt[N],w[N];int p[N];vector<int> st[N];inline bool comp(int a,int b){return ht[a]>ht[b];}inline int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}inline void merge(int x,int y,int k){int f1=find(x),f2=find(y);if(st[f1].size()>st[f2].size())swap(f1,f2);fa[f1]=f2;int res=0;for(int &x:st[f1]){chemx(res,Trie::query(rt[f2],w[x],18));st[f2].pb(x);}Trie::merge(rt[f2],rt[f1],rt[f2]);chemx(ans,res+k);}inline void solve(){for(int i=1;i<=n;i++)fa[i]=i,st[i].pb(i),Trie::insert(rt[i],w[i],18);for(int i=2;i<=n;i++)p[i-1]=i;sort(p+1,p+n,comp);for(int i=1;i<n;i++){int pos=p[i];merge(pos,pos-1,ht[pos]);}cout<<ans;}
}
int n;
char s[N];
char yyy;
int main(){n=read();scanf("%s",s+1);Sa::build(s,n);for(int i=1;i<=n;i++)Sa::w[Sa::rk[i]]=read();Sa::solve();
}

【LOJ#6198】—谢特(后缀数组+01Trie)相关推荐

  1. [BZOJ2754][SCOI2012]喵星球上的点名(后缀数组+莫队)

    Address 洛谷P2336 BZOJ2754 LOJ#2374 Solution 考虑在每个人的姓和名之间插入一个无关的字符. 这样问题就转化成了一些主串和一些模式串,询问每个模式串能匹配到多少个 ...

  2. 寻找一个字符串的重复子串 后缀数组

    什么是后缀数组 令字符串 S=S[1]S[2]...S[n]S=S[1]S[2]...S[n]{\displaystyle S=S[1]S[2]...S[n]} , S[i,j]S[i,j]{\dis ...

  3. 【2012百度之星/资格赛】H:用户请求中的品牌 [后缀数组]

    时间限制: 1000ms 内存限制: 65536kB 描述 馅饼同学是一个在百度工作,做用户请求(query)分析的同学,他在用户请求中经常会遇到一些很奇葩的词汇.在比方说"johnsonj ...

  4. Boring counting HDU - 3518 (后缀数组)

    Boring counting \[ Time Limit: 1000 ms \quad Memory Limit: 32768 kB \] 题意 给出一个字符串,求出其中出现两次及以上的子串个数,要 ...

  5. HDU4080 Stammering Aliens(二分 + 后缀数组)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4080 Description Dr. Ellie Arroway has establish ...

  6. 后缀数组 + Hash + 二分 or Hash + 二分 + 双指针 求 LCP ---- 2017icpc 青岛 J Suffix (假题!!)

    题目链接 题目大意: 就是给你n个串每个串取一个后缀,要求把串拼起来要求字典序最小!! sum_length_of_n≤5e5sum\_length\_of\_n\leq 5e5sum_length_ ...

  7. 后缀数组 ---- 2018~2019icpc焦作H题[后缀数组+st表+二分+单调栈]

    题目链接 题目大意: 给出nnn个数,定义f[l,r]f[l,r]f[l,r]表示 区间[l,r][l,r][l,r]的最大值,求所有 子区间的最大值的和,要求相同的子区间只能算一次 比如数列 5 6 ...

  8. [Ahoi2013]差异[后缀数组+单调栈]

    链接 解题思路:很明显前面∑1<=i<j<=nlen(Ti)+len(Tj)\sum_{1<=i<j<=n}len(T_i)+len(T_j)∑1<=i< ...

  9. poj2217详解 ( 后缀数组 + 高度数组 )

    题目大概意思就是 给两个字符串,求最长公共字符串子串长度 我们可以考虑用后缀数组和高度数组 一个字符串 中 最长的两个相同字符串长度, 不就是 后缀数组中相邻两个后缀的最长公共前缀, 不就是 高度数组 ...

  10. 树链剖分 + 后缀数组 - E. Misha and LCP on Tree

    E. Misha and LCP on Tree Problem's Link Mean: 给出一棵树,每个结点上有一个字母.每个询问给出两个路径,问这两个路径的串的最长公共前缀. analyse: ...

最新文章

  1. 2010Bossie大奖:十佳开源平台和中间件
  2. Python 得到主机字节序
  3. PHP的pm、pm.max_requests、memory_limit
  4. Cache技术―OSCache
  5. SAP License:SAP中的PRC增值税概念
  6. 捕获asp.net下的未处理异常
  7. 查看 SQL2005 Reporting services文件夹报表权限
  8. 64位userdata.dll丢失_因为计算机中丢失OCI.dll尝试重新安装该程序以解决此问题
  9. PDG转PDF全攻略
  10. Hive 窗口函数的使用
  11. 目前常用的4种备份系统架构
  12. 某妹游戏登录加密(webpack)
  13. [C# Fundamantal] 类继承简析
  14. 微信拍一拍怎么撤回(无法撤回原因是这样的)
  15. c语言 x16 x15 x2 1,CRC算法原理及C语言实现
  16. 头脑王者小程序开发源码分析
  17. 互动云渲染——云原生渲染的初步探索
  18. linux基本功系列之pwd命令实战
  19. 商城系统建设:如何搭建自己的网上商城平台
  20. 可以通过限定ip来限制用户重复登录么_美团和饿了么虽然每天都送红包,但有很大区别...

热门文章

  1. 一年之计在于春丨看, 农田里的科技范儿
  2. swper_swiper
  3. 微商怎么推广引流?学会玩豆瓣让精准流量源源不断
  4. class path resource [springMVC-servlet.xml] cannot be opened because it does not exist
  5. 生前个个说恩深,死后人人欲扇魂。画虎画皮难画骨,知人知面不知心。
  6. xlsx表格怎么做汇总统计_表格进行分类汇总怎么做
  7. 图解数据结构与算法【Java】0概述
  8. zblog php mip,ZBlogPhp模版-极简百度MIP自适应主题
  9. 《第五项修炼》读后感
  10. mysql支付成功订单数超过10_1.超时未支付订单处理