模板—字符串—后缀自动机(后缀自动机+线段树合并求right集合)

Code:

#include <bits/stdc++.h>
using namespace std;
#define N 100010
map <int,int> son[N<<1]; char str[N]; int root[N<<1],pla[N],len;
int tot=1,last=1,pre[N<<1],dis[N<<1],in[N<<1];
namespace Sam
{
void insert(int x,int id)
{
int p=last,np=last=++tot; dis[np]=dis[p]+1,pla[id]=np;
while(p&&!son[p][x]) son[p][x]=np,p=pre[p];
if(!p) {pre[np]=1;return;} int q=son[p][x];
if(dis[q]==dis[p]+1) {pre[np]=q;return;} int nq=++tot;
dis[nq]=dis[p]+1,son[nq]=son[q],pre[nq]=pre[q],pre[q]=pre[np]=nq;
while(p&&son[p][x]==q) son[p][x]=nq,p=pre[p];;
}
}
using namespace Sam;
struct Node {int son[2],size;}node[N<<7];
namespace Tree
{
int cnt;
void pushup(int p) {node[p].size=node[node[p].son[0]].size+node[node[p].son[1]].size;}
void merge(int &x,int y)
{
if(!y) return; if(!x) {x=y;return;}
node[++cnt]=node[x],x=cnt;
merge(node[x].son[0],node[y].son[0]),merge(node[x].son[1],node[y].son[1]),pushup(x);
}
void change(int &p,int l,int r,int x)
{
if(!p) p=++cnt; if(l==r) {node[p].size++;return;}
int mid=(l+r)>>1;
if(x<=mid) change(node[p].son[0],l,mid,x);
else change(node[p].son[1],mid+1,r,x); pushup(p);
}
}
using namespace Tree;
int main()
{
queue <int> q;
scanf("%s",str+1),len=strlen(str+1);
for(int i=1;i<=len;i++) insert(str[i]-'a',i);
for(int i=1;i<=len;i++) change(root[pla[i]],1,len,i);
for(int i=2;i<=tot;i++) in[pre[i]]++;
for(int i=1;i<=tot;i++) if(!in[i]) q.push(i);
while(!q.empty())
{
int p=q.front(); q.pop(),in[pre[p]]--;
if(!in[pre[p]]) q.push(pre[p]);
merge(root[pre[p]],root[p]);
}
}

  

模板—字符串—后缀自动机(后缀自动机+线段树合并求right集合)的更多相关文章

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

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

  2. 【codeforces666E】Forensic Examination 广义后缀自动机+树上倍增+线段树合并

    题目描述 给出 $S$ 串和 $m$ 个 $T_i$ 串,$q$ 次询问,每次询问给出 $l$ .$r$ .$x$ .$y$ ,求 $S_{x...y}$ 在 $T_l,T_{l+1},...,T_r ...

  3. CF547E Milk and Friends(AC自动机的fail指针上建主席树 或 广义后缀自动机的parent线段树合并)

    What-The-Fatherland is a strange country! All phone numbers there are strings consisting of lowercas ...

  4. 2019.02.27 bzoj4556: [Tjoi2016&Heoi2016]字符串(二分答案+sam+线段树合并)

    传送门 题意:给一个字符串SSS. 有mmm次询问,每次给四个参数a,b,c,da,b,c,da,b,c,d,问s[a...b]s[a...b]s[a...b]的所有子串和s[x...y]s[x... ...

  5. [NOI2018]你的名字(后缀自动机+线段树合并)

    看到题目名字去补番是种怎么样的体验 我只会 \(68\) 分,打了个暴力.正解看了一会儿,发现跟 \([HEOI2016/TJOI2016]\) 字符串很像,用线段树合并维护 \(endpos\) 集 ...

  6. Codeforces 666E Forensic Examination(广义后缀自动机+线段树合并)

    将所有串(包括S)放一块建SAM.对于询问,倍增定位出该子串所在节点,然后要查询的就是该子串在区间内的哪个字符串出现最多.可以线段树合并求出该节点在每个字符串中的出现次数. #include<b ...

  7. 洛谷P4770 [NOI2018]你的名字 [后缀自动机,线段树合并]

    传送门 思路 按照套路,直接上后缀自动机. 部分分:\(l=1,r=|S|\) 首先把\(S\)和\(T\)的后缀自动机都建出来. 考虑枚举\(T\)中的右端点\(r\),查询以\(r\)结尾的串最长 ...

  8. CF1037H Security 后缀自动机 + right集合线段树合并 + 贪心

    题目描述: 给定一个字符串 $S$ 给出 $Q$ 个操作,给出 $L,R,T$,求出字典序最小的 $S_{1}$ 为 $S[L...R]$的子串,且 $S_{1}$ 的字典序严格大于 $T$. 输出这 ...

  9. HDU4641 K-string(后缀自动机+线段树合并)

    先考虑没有动态加字符怎么做.计算每个节点的贡献,当|right|>=k时将len-lenfa计入即可. 动态加字符后,这个东西难以用LCT维护.于是考虑离线.建完SAM后,容易发现每个节点在时间 ...

随机推荐

  1. Jmeter编码问题

    问题现象:1.利用csv data set config参数化数据后,在beanshell中引用,能正常引用到,但是传给服务器时,还是报手机号格式不对 将jmeter日志级别打成debug(jmete ...

  2. Eclipse 出现“polling news feeds”的解决办法

    小编突然心血来潮,安装了一下Java的环境,eclipse的IDE来写点Java,但是是不是出现以下的弹窗,实在是闹心,后来网上看了前辈们的解决办法,特此记录一下.如有侵权,敬请告知!!! 1. 找到 ...

  3. KMP算法-Python版

                               KMP算法-Python版 传统法: 从左到右一个个匹配,如果这个过程中有某个字符不匹配,就跳回去,将模式串向右移动一位.这有什么难的? 我们可以 ...

  4. Java对字符串进行加密

    package anli1; import java.util.Scanner; public class example { public static void main(String[]args ...

  5. dinic 算法 基本思想及其模板

    “网络流博大精深”—sideman语 一个基本的网络流问题 感谢WHD的大力支持 最早知道网络流的内容便是最大流问题,最大流问题很好理解: 解释一定要通俗! 如右图所示,有一个管道系统,节点{1,2, ...

  6. js 回车触发点击事件

    $(document).keyup(function(event){ if(event.keyCode ==13){ $("#submit").trigger("clic ...

  7. mysql备份策略

    1.备份的种类 完全备份,就是备份整个数据库对象 事务日志备份, 备份事务日志记录上一次的数据库改变 增量备份,也叫差异备份 文件备份 2.备份方式 逻辑备份, 既备份sql语句,使用mysql自带的 ...

  8. IPV4的地址是如何分类的?网络号的范围分别是多少?

    1. A类地址 (1)A类地址第1字节为网络地址,其它3个字节为主机地址. (2)A类地址范围:1.0.0.1—126.255.255.254 (3)A类地址中的私有地址和保留地址: ① 10.X.X ...

  9. jquery radio 行选中 操作

    想实现点击一行中任意位置 此行的 radio 选中. function rowClick(t) { var id = $(t).attr("id").substr(3, 1); / ...

  10. 《R语言实战》读书笔记--第一章 R语言介绍

    1.典型的数据分析过程可以总结为一下图形: 注意,在模型建立和验证的过程中,可能需要重新进行数据清理和模型建立. 2.R语言一般用 <- 作为赋值运算符,一般不用 = ,原因待考证.用-> ...