Description

XX在进行字符串研究的时候,遇到了一个十分棘手的问题。

在这个问题中,给定一个字符串S,与一个整数K,定义S的子串T=S(i, j)是关于第K位的识别子串,满足以下两个条件:

1、i≤K≤j。

2、子串T只在S中出现过一次。

例如,S="banana",K=5,则关于第K位的识别子串有"nana","anan","anana","nan","banan"和"banana"。

现在,给定S,XX希望知道对于S的每一位,最短的识别子串长度是多少,请你来帮助他。

Input

仅一行,输入长度为N的字符串S。

Output

输出N行,每行一个整数,第i行的整数表示对于第i位的最短识别子串长度。

建SAM,只有right集大小为1的节点对答案有贡献,

若其出现位置右端点为r,此节点可接受的最短串长为x,最长串长为y,

则对(r-x,r]用x更新最小值,对r-k (y<k≤x)则用k更新最小值

用两棵线段树维护答案,分别处理以上两种情况

此题卡内存...

#include<cstdio>
#include<cstring>
const int N=;
int nx[N][],fa[N],l[N],r[N],t[N],q[N],ql=,qr=,d[N],ptr=,pv=,len=;
char s[];
void ins(int w,int pos){
int p=pv,np=++ptr;
t[np]=;
r[np]=pos;
l[np]=l[p]+;
while(p&&!nx[p][w])nx[p][w]=np,p=fa[p];
if(!p)fa[np]=;
else{
int q=nx[p][w];
if(l[q]==l[p]+)fa[np]=q;
else{
int nq=++ptr;
memcpy(nx[nq],nx[q],sizeof(nx[]));
l[nq]=l[p]+;
fa[nq]=fa[q];
fa[q]=fa[np]=nq;
while(p&&nx[p][w]==q)nx[p][w]=nq,p=fa[p];
}
}
pv=np;
}
void build(){
for(int i=;i<=ptr;i++)++d[fa[i]];
for(int i=;i<=ptr;i++)if(!d[i])q[qr++]=i;
while(ql!=qr){
int w=q[ql++];
int u=fa[w];
if(!u)continue;
t[u]+=t[w];
r[u]=r[w];
if(!--d[u])q[qr++]=u;
}
}
int mn[],mn2[];
inline void mins(int&a,int b){if(a>b)a=b;}
void setmin(int l,int r,int x,int*mn){
for(l+=,r+=;l^r^;l>>=,r>>=){
if(~l&)mins(mn[l^],x);
if(r&)mins(mn[r^],x);
}
}
int ans[];
int main(){
memset(mn,,sizeof(mn));
memset(mn2,,sizeof(mn2));
scanf("%s",s);
for(len=;s[len];++len)ins(s[len]-'a',len+);
build();
for(int i=;i<=ptr;i++)if(t[i]==){
int ml=l[fa[i]];
setmin(r[i]-ml+,r[i],ml+,mn);
setmin(r[i]-l[i]+,r[i]-ml,r[i]+,mn2);
}
for(int i=;i<;i++){
int lc=i<<,rc=lc^;
mins(mn[lc],mn[i]),mins(mn[rc],mn[i]);
mins(mn2[lc],mn2[i]),mins(mn2[rc],mn2[i]);
}
for(int i=;i<=len;i++){
ans[i]=mn[i+];
mins(ans[i],mn2[i+]-i);
}
for(int i=;i<=len;i++)printf("%d\n",ans[i]);
return ;
}

bzoj2865 字符串识别的更多相关文章

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

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

  2. bzoj千题计划319:bzoj2865: 字符串识别(后缀自动机 + 线段树)

    https://www.lydsy.com/JudgeOnline/problem.php?id=2865 同上一篇博客 就是卡卡空间,数组改成map #include<map> #inc ...

  3. 【BZOJ1396】识别子串&【BZOJ2865】字符串识别(后缀自动机)

    [BZOJ1396]识别子串&[BZOJ2865]字符串识别(后缀自动机) 题面 自从有了DBZOJ 终于有地方交权限题了 题解 很明显,只出现了一次的串 在\(SAM\)的\(right/e ...

  4. 用户代理字符串识别工具源码与slf4j日志使用

    User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本.CPU 类型.浏览器及版本.浏览器渲染引擎.浏览器语言.浏览器插件等.UA也成为了, ...

  5. 2018.12.23 bzoj2865&&1396: 字符串识别(后缀自动机+线段树)

    传送门 卡空间差评! 题意简述:给一个字串,对于每个位置求出经过这个位置且只在字串中出现一次的子串的长度的最小值. 解法:先建出samsamsam,显然只有当sizep=1size_p=1sizep​ ...

  6. 【BZOJ-1396&2865】识别子串&字符串识别 后缀自动机/后缀树组 + 线段树

    1396: 识别子串 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 312  Solved: 193[Submit][Status][Discuss] ...

  7. IDA插件栈字符串识别插件

    该插件是一款可以自动识别栈上局部变量为字符串的插件,字符串形式如下,并自动的加上注释                                       如图:可以自动识别栈上的字符串 项目主 ...

  8. 华为机试_字符串识别_Vector的使用;

    第一题:拼音转数字输入是一个只包含拼音的字符串,请输出对应的数字序列.转换关系如下:描述:      拼音        yi  er  san  si  wu  liu  qi  ba  jiu  ...

  9. BZOJ 2865 字符串识别 | 后缀数组 线段树

    集训讲字符串的时候我唯一想出正解的题-- 链接 BZOJ 2865 题面 给出一个长度为n (n <= 5e5) 的字符串,对于每一位,求包含该位的.最短的.在原串中只出现过一次的子串. 题解 ...

随机推荐

  1. python 获取列表大于指定长度的元素

    def long_words(n, str): word_len = [] txt = str.split(" ") for x in txt: if len(x) > n: ...

  2. JQuery中width和JS中JS中关于clientWidth offsetWidth scrollWidth 等的含义

    JQuery中: width()方法用于获得元素宽度: innerWidth()方法用于获得包括内边界(padding)的元素宽度: outerWidth()方法用于获得包括内边界(padding)和 ...

  3. thinkphp5的auth权限认证(转自thinkphp官方文档+自己总结)

    thinkphp5的auth权限认证(转自thinkphp官方文档+自己总结) 一.总结 一句话总结:相当于就是用其它thinkphp的扩展一样,都是引入扩展,配置扩展,然后使用 引入 配置 使用 基 ...

  4. git报错:src refspec master does not match any

    问题出现:git推送本地内容到远程仓库时,报错src refspec master does not match any. 1.我的流程: mkdir project_k命令,新建本地仓库. cd p ...

  5. idea JMX 连接器服务器通信错误

    错误描述:错误: JMX 连接器服务器通信错误: service:jmx:rmi://DESKTOP-46OA4KK 打开Edit Configurations 发现vm options那一栏居然是空 ...

  6. 个人知识管理系统Version1.0开发记录(12)

    最近碰到个问题,在五个工作日内阅读一个百万行左右代码量的新项目集合,如何解决呢? 第一个工作日,环境观察.待在那个项目组,看项目成员们在做些什么事情,开发,测试,聊天,或多或少可以收集到一些项目相关的 ...

  7. bzoj1225

    题解: 数论+报搜 首先套一个计算因子个数的公式 枚举一下这个数 代码: #include<bits/stdc++.h> using namespace std; ],res[],tmp[ ...

  8. RALL资源获取初始化,删除器

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  9. ES6学习一 JS语言增强篇

    一 背景 JavaScript经过二十来年年的发展,由最初简单的交互脚本语言,发展到今天的富客户端交互,后端服务器处理,跨平台(Native),以及小程序等等的应用.JS的角色越来越重要,处理场景越来 ...

  10. Java中,什么时候用logger.debuge,info,error

    简单的说,就是配合log的等级过滤输出比如,你在开发的时候,要验证一个方法有没有被调用到,为了方便调试,通常会在这个方法开始的时候加一些system.out.但是项目真正发布的时候这些代码通常是要移除 ...