传送门


题解:

写完去看了一下正解,是后缀数组上按照height从大到小对01Trie启发式合并。

然而建出后缀树直接把01Trie拿来dsu on tree岂不妙哉?

没什么好说的,挺普通的一道题。


代码:

#include<bits/stdc++.h>
#define ll long long
#define re register
#define gc get_char
#define cs constnamespace IO{inline char get_char(){static cs int Rlen=1<<22|1;static char buf[Rlen],*p1,*p2;return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,Rlen,stdin),p1==p2)?EOF:*p1++;}inline int get_s(char *s){int len=0;char c;while(isspace(c=gc()));while(s[len++]=c,!isspace(c=gc())&&c!=EOF);s[len]='\0';return len;}template<typename T>inline T get(){char c;while(!isdigit(c=gc()));T num=c^48;while(isdigit(c=gc()))num=(num+(num<<2)<<1)+(c^48);return num;}inline int getint(){return get<int>();}
}
using namespace IO;using std::cerr;
using std::cout;cs int N=1e5+5;int n;
char s[N];
int w[N];
int ans;namespace Trie{cs int N=::N*20,B=17;int son[N][2],tot;inline void clear(){while(tot){son[tot][0]=son[tot][1]=0;--tot;}son[0][0]=son[0][1]=0;}inline void ins(int val){int cur=0;for(int re i=B-1;~i;--i){bool f=val&(1<<i);if(!son[cur][f])son[cur][f]=++tot;cur=son[cur][f];}}inline int query(int val){if(!tot)return -1e9;int cur=0,res=0;for(int re i=B-1;~i;--i){bool f=val&(1<<i);if(son[cur][!f])res|=1<<i,cur=son[cur][!f];else cur=son[cur][f];}return res;}
}namespace SAM{static cs int N=::N<<1;int son[N][26],len[N],fa[N],last=1,now=1;int val[N];inline void push_back(char c,int w){c-='a';int p=last,cur=last=++now;len[cur]=len[p]+1;val[cur]=w;for(;p&&!son[p][c];p=fa[p])son[p][c]=cur;if(!p)fa[cur]=1;else if(len[son[p][c]]==len[p]+1)fa[cur]=son[p][c];else {int nq=++now,q=son[p][c];val[nq]=-1;memcpy(son[nq],son[q],sizeof son[q]);len[nq]=len[p]+1;fa[nq]=fa[q];fa[q]=fa[cur]=nq;for(;p&&son[p][c]==q;p=fa[p])son[p][c]=nq;}}std::vector<int> E[N];int in[N],out[N],p[N],clk;int siz[N],ch[N];inline void build(){for(int re i=n;i;--i)push_back(s[i],w[i]);for(int re i=2;i<=now;++i)E[fa[i]].push_back(i);}void dfs(int u){siz[u]=val[u]!=-1;p[in[u]=++clk]=u;for(int re v:E[u]){dfs(v);siz[u]+=siz[v];if(siz[v]>siz[ch[u]])ch[u]=v;}out[u]=clk;}void dsu(int u){for(int re v:E[u])if(v!=ch[u])dsu(v),Trie::clear();if(ch[u])dsu(ch[u]);for(int re v:E[u])if(v!=ch[u]){for(int re i=in[v];i<=out[v];++i)if(~val[p[i]])ans=std::max(ans,len[u]+Trie::query(val[p[i]]));for(int re i=in[v];i<=out[v];++i)if(~val[p[i]])Trie::ins(val[p[i]]);}if(~val[u]){ans=std::max(ans,len[u]+Trie::query(val[u]));Trie::ins(val[u]);}}
}signed main(){//  freopen("shit.in","r",stdin);n=getint();get_s(s+1);for(int re i=1;i<=n;++i)w[i]=getint();SAM::build();SAM::dfs(1);SAM::dsu(1);cout<<ans<<"\n";return 0;
}

【LOJ6198】谢特(后缀自动机)(01Trie)(dsu on tree)相关推荐

  1. BZOJ3172lg3966 TJOI单词(广义后缀自动机)

    BZOJ3172&&lg3966 TJOI单词(广义后缀自动机) 题面 自己找去 HINT 给出多个文本串,让你查找每个文本串一共出现了多少次,广义后缀自动机建出parent tree ...

  2. [BJWC2018]Border 的四种求法(后缀自动机+链分治+线段树合并)

    题目描述 给一个小写字母字符串 S ,q 次询问每次给出 l,r ,求 s[l..r] 的 Border . Border: 对于给定的串 s ,最大的 i 使得 s[1..i] = s[|s|-i+ ...

  3. 【POJ1509】Glass Beads 【后缀自动机】

    题意 给出一个字符串,求它的最小表示法. 分析 这个题当然可以用最小表示法做啦!但是我是为了学后缀自动机鸭! 我们把这个字符串长度乘二,然后建SAM,然后在SAM上每次跑最小的那个字母,找出长度为n的 ...

  4. bzoj 2946 [Poi2000]公共串——后缀自动机

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2946 对每个串都建一个后缀自动机,然后 dfs 其中一个自动机,记录同步的话在别的自动机上走 ...

  5. 后缀自动机 ---- P3804 【模板】后缀自动机(求每个等价类最长串的出现次数)

    后缀自动机一些关键点 首先后缀自动机上面每个节点都是一个等价类并且是最长的字符串的结尾 后缀自动机上的fail链反建就是parent tree,下面是SAM和Parent tree的构造 对于这道模板 ...

  6. 洛谷P3966 [TJOI2013]单词(后缀自动机)

    传送门 统计单词出现次数--为啥大家都是写AC自动机的嘞--明明后缀自动机也能做的说-- 统计出现次数这个就直接按长度排序然后做个dp就好,这是SAM的板子的要求啊,不提了 然后考虑怎么让所有串之间隔 ...

  7. hihocoder 后缀自动机专题

    一.后缀自动机基本概念的理解 1.首先后缀自动机的状态是由子串的endpos来决定的 子串的endpos是指一个子串可以在原字符串的哪些位置进行匹配, endpos构成的不同集合划分成不同的状态 关于 ...

  8. BZOJ3998: [TJOI2015]弦论(后缀自动机,Parent树)

    Description 对于一个给定长度为N的字符串,求它的第K小子串是什么. Input 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T和K,T为0则表示不同位置的相同子串算作一个. ...

  9. 从零开始の后缀自动机

    后缀自动机,一个处理字符串问题的神器.听起来很神圣,貌似很难写.其实代码实现并不复杂,萌新估计都能学会. 以前听学长们讲过好多次也看过陈立杰的课件,都不是很明白.今天终于弄明白了,就写一个让大家都能看 ...

  10. 【BZOJ3926】[Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机

    [BZOJ3926][Zjoi2015]诸神眷顾的幻想乡 Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝 ...

最新文章

  1. jmeter插件 --PerfMon Metrics Collector监控工具的使用
  2. Matlab自定义函数的几种方法
  3. [转]游戏中各种性能优化方法(不断更新)
  4. 三探·模块拼装思想(静态链接)
  5. 代码生成技术--CodeDom VS T4
  6. 将一句话的单词进行倒置,标点符号不倒换。比如一句话:“i love you.”倒换后变为you. love i
  7. php调用文章标题,zblogphp标题格式的标签调用详细说明
  8. Vue数据更新数据不渲染问题 - 资源篇
  9. vue项目html,Vue项目接口.html
  10. Uber 开源深度学习分布训练库 Petastorm
  11. php 7 xhprof,php7中使用xhprof解析
  12. [root@py ~]# watch -n 1 ifconfig 求解释
  13. [python] 网络编程游戏
  14. 办公用品管理系统服务器版,求索办公用品管理系统 2019
  15. 北上广深,逃离还是奔向?
  16. ubuntu grub深入剖析个性设置
  17. 【Spark】Spark基础教程
  18. 实例九— 除法器设计
  19. 30个HTML+CSS前端开发案例(完结篇)
  20. 阿里云产品推荐——弹性裸金属服务器(神龙)

热门文章

  1. UVA - 10827 Maximum sum on a torus
  2. element 验证出现英文以及自动验证问题
  3. 【Python百日进阶-Web开发-Feffery】Day344 - fac数据展示02:AntdBadge徽标数
  4. Matlab中将横纵坐标改为自定义标签(set(gca,xtick)set(gca,xticklabel))
  5. power bi报表html,数据可视化系列:Power BI基于Web数据的报表制作(经典级示例)
  6. [CF106C]Buns -多重背包
  7. Python基础 —— 输入输出
  8. 软考中级网络工程师学习笔记(知识点汇总)单点详细版
  9. NeRF神经辐射场学习笔记(十)— BungeeNeRF(CityNeRF)实现以及代码注释
  10. 计算机内存和显卡,电脑显卡和内存怎么看