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. SpringBoot与Dubbo整合上篇

    最近学习了一下dubbo,是阿里巴巴公司的一个开源服务框架.目前我们公司实现两个不同系统的之间通信,是采用了Oracle的OSB作为服务的管理(即企业服务总线的一种实现),服务提供方在OSB上注册业务 ...

  2. UVa 11489 整数游戏

    https://vjudge.net/problem/UVA-11489 题意: 给出一个数字串n,两个人轮流从中取出一个数字,要求每次取完之后剩下的数是3的倍数,不能取数者输. 思路: 要想取掉一个 ...

  3. spring boot2 基于百度云apiface实现人脸检测与认证1

    原理介绍: 基于百度云的人脸资料库(用户上传),调用本地摄像头抓拍的图像,与百度云的用户图像做比对,实现人脸认证. 主要步骤如下: 1. 创建百度去账号 2. 在百度云控制台中创建人脸识别的应用,并记 ...

  4. activemq、rabbitmq、kafka原理和比较

    一.activemq 虽然是java写的消息队列,但是提供Java, C, C++, C#, Ruby, Perl, Python, PHP各种客户端,所以语言上是没什么问题的.配置和使用,基本上是j ...

  5. Rails 5 Test Prescriptions 第11章其他部分的测试。

    Routes✅ Helper Methods✅ Controllers and Requests✅ Simulating Requests⚠️,看之前的博客 What to Expect in a R ...

  6. Granting and Managing Item Level Permission using SharePoint2013 Designer Workflow

    https://gnanasivamgunasekaran.wordpress.com/2015/12/29/granting-and-managing-item-level-permission-u ...

  7. Oracle Sourcing Implementation and Administration Guide(转)

    原文地址 Oracle Sourcing Implementation and Administration Guide

  8. oracle分区交换技术

    交换分区的操作步骤如下: 1. 创建分区表t1,假设有2个分区,P1,P2.2. 创建基表t11存放P1规则的数据.3. 创建基表t12 存放P2规则的数据.4. 用基表t11和分区表T1的P1分区交 ...

  9. poj3814

    题解: 所以poj只放了一组数据? 打表(花费了我无数心血找的的打标) 代码: #include <stdio.h> int main(){ printf("1\n2\n1\n2 ...

  10. RabbitMQ 基础类和概念讲解

    转至:http://www.ostest.cn/archives/497 引言 你是否遇到过两个(多个)系统间需要通过定时任务来同步某些数据?你是否在为异构系统的不同进程间相互调用.通讯的问题而苦恼. ...