bzoj2865 字符串识别
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 字符串识别的更多相关文章
- BZOJ1396 识别子串 和 BZOJ2865 字符串识别
字符串识别 2865: 字符串识别 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 839 Solved: 261[Submit][Status][D ...
- bzoj千题计划319:bzoj2865: 字符串识别(后缀自动机 + 线段树)
https://www.lydsy.com/JudgeOnline/problem.php?id=2865 同上一篇博客 就是卡卡空间,数组改成map #include<map> #inc ...
- 【BZOJ1396】识别子串&【BZOJ2865】字符串识别(后缀自动机)
[BZOJ1396]识别子串&[BZOJ2865]字符串识别(后缀自动机) 题面 自从有了DBZOJ 终于有地方交权限题了 题解 很明显,只出现了一次的串 在\(SAM\)的\(right/e ...
- 用户代理字符串识别工具源码与slf4j日志使用
User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本.CPU 类型.浏览器及版本.浏览器渲染引擎.浏览器语言.浏览器插件等.UA也成为了, ...
- 2018.12.23 bzoj2865&&1396: 字符串识别(后缀自动机+线段树)
传送门 卡空间差评! 题意简述:给一个字串,对于每个位置求出经过这个位置且只在字串中出现一次的子串的长度的最小值. 解法:先建出samsamsam,显然只有当sizep=1size_p=1sizep ...
- 【BZOJ-1396&2865】识别子串&字符串识别 后缀自动机/后缀树组 + 线段树
1396: 识别子串 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 312 Solved: 193[Submit][Status][Discuss] ...
- IDA插件栈字符串识别插件
该插件是一款可以自动识别栈上局部变量为字符串的插件,字符串形式如下,并自动的加上注释 如图:可以自动识别栈上的字符串 项目主 ...
- 华为机试_字符串识别_Vector的使用;
第一题:拼音转数字输入是一个只包含拼音的字符串,请输出对应的数字序列.转换关系如下:描述: 拼音 yi er san si wu liu qi ba jiu ...
- BZOJ 2865 字符串识别 | 后缀数组 线段树
集训讲字符串的时候我唯一想出正解的题-- 链接 BZOJ 2865 题面 给出一个长度为n (n <= 5e5) 的字符串,对于每一位,求包含该位的.最短的.在原串中只出现过一次的子串. 题解 ...
随机推荐
- TortoiseGit 访问https远程仓库,上报SSL证书错误解决方法
报错 在使用TortoiseGit时,clone自己搭建的gitlab报如错SSL certificate problem: self signed certificate 原因:自行搭建的gitla ...
- How does flyway sort version numbers?
https://stackoverflow.com/questions/19984397/how-does-flyway-sort-version-numbers In one word: numer ...
- ACM赛前准备——模板(排版篇)
ACM赛前准备--模板(排版篇) 更新 前言 效果演示 封面 目录页 模板页(不分栏) 模板页(分栏) 结果文件 快速使用 准备工作 安装TexLive (可选)安装minted包 创建模板 文件结构 ...
- [Pytorch]Pytorch 细节记录(转)
文章来源 https://www.cnblogs.com/king-lps/p/8570021.html 1. PyTorch进行训练和测试时指定实例化的model模式为:train/eval eg: ...
- python应用-matplotlib绘图
详细内容参看:官网 测试数据: # 传入的参数 x=[1,2,3,4,5] squares=[1,4,9,16,25] 简单的绘图 import matplotlib.pyplot as plt de ...
- Tensorflow1.5.0+cuda9.0+cudnn7.0+gtx1080+ubuntu16.04
目录 Tensorflow1.5.0+cuda9.0+cudnn7.0+gtx1080+ubuntu16.04 0. 前记 1. 环境说明 2. 安装GTX1080显卡驱动 3. CUDA 9.0安装 ...
- [转]如何使用VS 2013發布一個可以在Windows XP中獨立運行的可執行文件
https://read01.com/Mg337.html (台/湾的论坛,需要f/q) 1. 閱讀此文章的同學先看看我的另外一篇文章: 現在,我們深入探討一下: <如何使用VS 2013發布一 ...
- Android中的自定义注解(反射实现-运行时注解)
预备知识: Java注解基础 Java反射原理 Java动态代理 一.布局文件的注解 我们在Android开发的时候,总是会写到setContentView方法,为了避免每次都写重复的代码,我们需要使 ...
- 【Python】解决测试依赖之 Mock模块的基本使用
什么是mock? Mock,顾名思义,模拟,在我们日常生活中或者影视作品中见得最多的可能就是预备飞行员的模拟训练,印象比较深的是电影<萨利机长>中的模拟器,经过几千次模拟,人们得出机长萨利 ...
- .net core部署到linux
1.Install the .NET SDK 我的服务器是腾讯云的Ubuntu 16 注册Microsoft密钥和订阅源 wget -q https://packages.microsoft.com/ ...