复习SAM板子啦!考前刷水有益身心健康当然这不是板子题/水题……

很容易发现只在i位置出现的串一定是个前缀串。那么对答案的贡献分成两部分:一部分是len[x]-fa~len[x]的这部分贡献会是r-l+1;剩下一部分1~len-fa-1这部分会和i~r构成答案,写两棵线段树即可。

然后就又是板子题了,两个板子(SAM+线段树)套起来。

#include<bits/stdc++.h>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
using namespace std;
const int N=2e5+,inf=0x3f3f3f3f;
int n,lst=,rt=,cnt=,ch[N][],len[N],fa[N],sz[N];
char s[N];
struct tree{
int mn[N<<];
void init(){memset(mn,0x3f,sizeof mn);}
void pushdown(int rt)
{
if(mn[rt]==inf)return;
mn[rt<<]=min(mn[rt<<],mn[rt]),mn[rt<<|]=min(mn[rt<<|],mn[rt]);
mn[rt]=inf;
}
void update(int L,int R,int v,int l,int r,int rt)
{
if(L<=l&&r<=R){mn[rt]=min(mn[rt],v);return;}
int mid=l+r>>;pushdown(rt);
if(L<=mid)update(L,R,v,lson);
if(R>mid)update(L,R,v,rson);
}
int query(int k,int l,int r,int rt)
{
if(l==r)return mn[rt];
int mid=l+r>>;pushdown(rt);
if(k<=mid)return query(k,lson);
return query(k,rson);
}
}tr1,tr2;
void build(int c)
{
int p=lst,np=++cnt;
len[np]=len[p]+,sz[np]=;
while(p&&!ch[p][c])ch[p][c]=np,p=fa[p];
if(!p)fa[np]=rt;
else{
int q=ch[p][c];
if(len[p]+==len[q])fa[np]=q;
else{
int nq=++cnt;
memcpy(ch[nq],ch[q],sizeof ch[q]);
fa[nq]=fa[q],fa[np]=fa[q]=nq,len[nq]=len[p]+;
while(p&&ch[p][c]==q)ch[p][c]=nq,p=fa[p];
}
}
lst=np;
}
int main()
{
scanf("%s",s+),n=strlen(s+);
for(int i=;i<=n;i++)build(s[i]-'a');
for(int i=;i<=cnt;i++)sz[i]=;
for(int i=;i<=cnt;i++)sz[fa[i]]=;
tr1.init(),tr2.init();
for(int i=;i<=cnt;i++)
if(sz[i]==)
{
int l=len[i]-len[fa[i]],r=len[i];
if(l>=)tr1.update(,l-,r+,,n,);
tr2.update(l,r,r-l+,,n,);
}
for(int i=;i<=n;i++)printf("%d\n",min(tr1.query(i,,n,)-i,tr2.query(i,,n,)));
}

bzoj1396识别子串(SAM+线段树)的更多相关文章

  1. BZOJ1396:识别子串(SAM)

    Description Input 一行,一个由小写字母组成的字符串S,长度不超过10^5 Output L行,每行一个整数,第i行的数据表示关于S的第i个元素的最短识别子串有多长. Sample I ...

  2. BZOJ1396 识别子串【SAM+SegmentTree】

    BZOJ1396 识别子串 给定一个串\(s\),对于串中的每个位置,输出经过这个位置且只在\(s\)中出现一次的子串的最短长度 朴素的想法是,我们要找到那些只出现一次的子串,之后遍历每个串,把串所覆 ...

  3. BZOJ1396 识别子串 和 BZOJ2865 字符串识别

    字符串识别 2865: 字符串识别 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 839  Solved: 261[Submit][Status][D ...

  4. BZOJ1396 识别子串 字符串 SAM 线段树

    原文链接http://www.cnblogs.com/zhouzhendong/p/9004467.html 题目传送门 - BZOJ1396 题意 给定一个字符串$s$,$|s|\leq 10^5$ ...

  5. bzoj千题计划318:bzoj1396: 识别子串(后缀自动机 + 线段树)

    https://www.lydsy.com/JudgeOnline/problem.php?id=1396 后缀自动机的parent树上,如果不是叶子节点,那么至少有两个子节点 而一个状态所代表子串的 ...

  6. BZOJ1396: 识别子串(后缀自动机,线段树)

    Description Input 一行,一个由小写字母组成的字符串S,长度不超过10^5 Output L行,每行一个整数,第i行的数据表示关于S的第i个元素的最短识别子串有多长. Sample I ...

  7. bzoj 1396: 识别子串【SAM+线段树】

    建个SAM,符合要求的串显然是|right|==1的节点多代表的串,设si[i]为right集合大小,p[i]为right最大的r点,这些都可以建出SAM后再parent树上求得 然后对弈si[i]= ...

  8. BZOJ1396: 识别子串(后缀自动机 线段树)

    题意 题目链接 Sol 后缀自动机+线段树 还是考虑通过每个前缀的后缀更新答案,首先出现次数只有一次,说明只有\(right\)集合大小为\(1\)的状态能对答案产生影响 设其结束位置为\(t\),代 ...

  9. BZOJ-1396: 识别子串

    后缀自动机+线段树 先建出\(sam\),统计一遍每个点的\(right\)集合大小\(siz\),对于\(siz=1\)的点\(x\),他所代表的子串只会出现一次,设\(y=fa[x]\),则这个点 ...

随机推荐

  1. Tensorflow学习教程------变量

    #coding:utf-8 import tensorflow as tf x = tf.Variable([1,2]) a = tf.constant([3,3]) #增加一个减法op sub = ...

  2. SpringCloud学习之手把手教你用IDEA搭建入门项目(三)

    本篇博客是承接上一篇<手把手教你用IDEA搭建SpringCloud入门项目(二)>,不清楚的请到我的博客空间查看后再看本篇博客,上面两篇博客成功创建了一个简单的SpringCloud项目 ...

  3. DRF框架之序列化器初体验

    首先,我们需要明白序列化和反序列化的过程指的是什么. 序列化操作:将模型数据 ---> 字典数据 --->JSON数据(响应JSON数据的操作) 反序列化操作:将JSON数据 ---> ...

  4. JavaScript 之 异步请求

    一. 1.异步(async) 异步,它的孪生兄弟--同步(Synchronous),"同步模式"就是上一段的模式,后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排 ...

  5. PyGame快速入门

    pygame 快速入门 目标 项目准备 使用 pygame 创建图形窗口 理解 图像 并实现图像绘制 理解 游戏循环 和 游戏时钟 理解 精灵 和 精灵组 项目准备 新建 飞机大战 项目 新建一个 h ...

  6. MSE(均方误差)、RMSE (均方根误差)、MAE (平均绝对误差)

    1.MSE(均方误差)(Mean Square Error) MSE是真实值与预测值的差值的平方然后求和平均. 范围[0,+∞),当预测值与真实值完全相同时为0,误差越大,该值越大. import n ...

  7. 1.GIT的安装使用

    官方安装文档:https://www.git-scm.com/book/en/v2/Getting-Started-Installing-Git 以下一mac安装做笔记 点击链接 http://git ...

  8. Tensorflow基础笔记

    1.Keras是一个由Python编写的开源人工神经网络库. 2.深度学习主要应用在三个大的方向,计算机视觉,自然语言处理,强化学习 3.计算机视觉主要有:图片识别,目标检测,语义分割,视频理解(行为 ...

  9. Dart异步编程-future

    Dart异步编程包含两部分:Future和Stream 该篇文章中介绍Future 异步编程:Futures Dart是一个单线程编程语言.如果任何代码阻塞线程执行都会导致程序卡死.异步编程防止出现阻 ...

  10. goweb-动作

    go-模板引擎 动作 Go 模板的动作就是一些嵌入到模板里面的命令,这些命令在模板中需要放到两个 大括号里{{ 动作 }},之前我们已经用过一个很重要的动作:点(.),它代表了传递给模 板的数据.下面 ...