博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[BZOJ1396]识别子串
阅读量:5809 次
发布时间:2019-06-18

本文共 1530 字,大约阅读时间需要 5 分钟。

设母串为$S$

在SAM里,一个节点$s$代表的字符串仅出现一次$\rightarrow\ s$到终点只有一条路$\rightarrow$没有节点$x$使得$fa_x=s$

定义$max_s$表示从起点走到$s$的最长路,我们可以找到一个仅出现一次的长度为$max_s$的$S$的前缀

而是它的后缀且出现多次的最大长度是$max_{fa_s}$,设$r=max_s,l=r-max_{fa_s}$

因为要覆盖$[l,r]$,所以对于$i\in[1,l)$,贡献答案为$r-i+1$,对于$i\in[l,r]$,贡献答案为$r-l+1$

用两棵区间取max的线段树,对于含$i$的在最后统计答案时减去$i$即可

#include
#include
struct sam{ int ch[26],fa,v;}t[200010];int las=1,M=1;void extend(int c){ int p=las,np=++M,q,nq; t[np].v=t[p].v+1; while(p&&t[p].ch[c]==0){ t[p].ch[c]=np; p=t[p].fa; } if(p==0) t[np].fa=1; else{ q=t[p].ch[c]; if(t[q].v==t[p].v+1) t[np].fa=q; else{ nq=++M; t[nq]=t[q]; t[nq].v=t[p].v+1; t[np].fa=t[q].fa=nq; while(p&&t[p].ch[c]==q){ t[p].ch[c]=nq; p=t[p].fa; } } } las=np;}char s[100010];bool mul[200010];int n;#define inf 2147483647int min(int a,int b){return a
>1; if(L<=mid)modify(L,R,v,l,mid,x<<1); if(mid
<<1|1); } int query(int p,int l,int r,int x){ if(l==r)return mn[x]; pushdown(x); int mid=(l+r)>>1; if(p<=mid) return query(p,l,mid,x<<1); else return query(p,mid+1,r,x<<1|1); }}a,b;int main(){ int i,l,r; gets(s+1); n=strlen(s+1); a.pre(); b.pre(); for(i=1;i<=n;i++)extend(s[i]-'a'); for(i=2;i<=M;i++)mul[t[i].fa]=1; for(i=2;i<=M;i++){ if(mul[i]==0){ r=t[i].v; l=r-t[t[i].fa].v; if(l>1)a.modify(1,l-1,r+1,1,n,1); b.modify(l,r,r-l+1,1,n,1); } } for(i=1;i<=n;i++)printf("%d\n",min(a.query(i,1,n,1)-i,b.query(i,1,n,1))); }

转载于:https://www.cnblogs.com/jefflyy/p/8536205.html

你可能感兴趣的文章
作用域声明提升
查看>>
采用JXL包进行EXCEL数据写入操作
查看>>
***CodeIgniter框架集成支付宝即时到账支付SDK
查看>>
Struts2访问ServletAPI的三种方式
查看>>
一周总结
查看>>
将txt文件转化为json进行操作
查看>>
XML
查看>>
【我的总结20170823】多实例部署
查看>>
[MySQL优化案例]系列 — slave延迟很大优化方法
查看>>
线性表4 - 数据结构和算法09
查看>>
C语言数据类型char
查看>>
Python线程详解
查看>>
Online Patching--EBS R12.2最大的改进
查看>>
说说我的web前端之路,分享些前端的好书
查看>>
Binary Search Tree Iterator leetcode
查看>>
Oracle性能优化--DBMS_PROFILER
查看>>
关闭Jquery Ajax 缓存
查看>>
uva-317-找规律
查看>>
Event事件的兼容性(转)
查看>>
CQRS学习——一个例子(其六)
查看>>