bzoj1396
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1396
题目大意:

题解:后缀自动机,只出现一次,那么就是right值为1,那么对于一段1----L----R来说,(L----R)为一个最短识别子串对于(1----L-1)则可以用R-i+1来更新,对于(L---R)则可以用R-L+1来更新,那么两个线段树来维护即可。
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define maxn 100005
using namespace std;
char s[maxn];
int n,m,tot,root;
bool v[maxn*];
struct data{
int last,son[maxn*][],val[maxn*],fa[maxn*];
void prepare(){root=last=tot=;}
int newnode(int x){val[++tot]=x; return tot;}
void extend(int x)
{
int p=last,np=newnode(val[p]+); last=np;
for (; p && !son[p][x]; p=fa[p]) son[p][x]=np;
if (!p) fa[np]=root;
else
{
int q=son[p][x];
if (val[q]==val[p]+) fa[np]=q;
else
{
int nq=newnode(val[p]+);
memcpy(son[nq],son[q],sizeof(son[nq]));
fa[nq]=fa[q];fa[q]=fa[np]=nq;
for (; p && son[p][x]==q; p=fa[p]) son[p][x]=nq;
}
}
}
void build ()
{
for (int i=; i<=n; i++) extend(s[i]-'a');
}
void whoisfather()
{
for (int i=; i<=tot; i++) v[fa[i]]=;
}
}SAM;
struct T{
int mn[maxn*];
T(){memset(mn,0x3f,sizeof(mn));}
void insert(int z,int l,int r,int x,int y,int w){
if(l>y||r<x) return;
if(l>=x&&r<=y){mn[z]=min(mn[z],w);return;}
int mid=(l+r)>>;
insert(z*,l,mid,x,y,w); insert(z*+,mid+,r,x,y,w);
}
int query(int z,int l,int r,int x){
if(l==r&&l==x) return mn[z];
int mid=(l+r)>>;
if(x<=mid) return min(mn[z],query(z*,l,mid,x));
else return min(mn[z],query(z*+,mid+,r,x));
}
}f,t;
int main()
{
scanf("%s",s+); n=strlen(s+);
SAM.prepare();
SAM.build();
SAM.whoisfather();
for (int i=; i<=tot; i++)
{
if (!v[i])
{
int l=SAM.val[i]-SAM.val[SAM.fa[i]],r=SAM.val[i];
f.insert(,,n,l,r,r-l+);
if (l>) t.insert(,,n,,l-,r);
}
}
for (int i=; i<=n; i++) printf("%d\n",min(f.query(,,n,i),t.query(,,n,i)-i+));
}
注:oyzx神犇清早刷神题,我就只能默默写渣渣题。
bzoj1396的更多相关文章
- BZOJ bzoj1396 识别子串
题面: bzoj1396 题解: 先建出SAM,并计算right集合大小.显然符合条件的点的right集合大小为1. 对于每个right集合为1的状态显然可以算出这些状态的pos以及maxlen和mi ...
- BZOJ1396 识别子串 字符串 SAM 线段树
原文链接http://www.cnblogs.com/zhouzhendong/p/9004467.html 题目传送门 - BZOJ1396 题意 给定一个字符串$s$,$|s|\leq 10^5$ ...
- 【bzoj1396】 识别子串
http://www.lydsy.com/JudgeOnline/problem.php?id=1396 (题目链接) 题意 问字符串S每一位的最短识别子串是多长(识别子串指包含这个字符且只出现在S中 ...
- 【BZOJ-1396&2865】识别子串&字符串识别 后缀自动机/后缀树组 + 线段树
1396: 识别子串 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 312 Solved: 193[Submit][Status][Discuss] ...
- 【BZOJ1396】识别子串&【BZOJ2865】字符串识别(后缀自动机)
[BZOJ1396]识别子串&[BZOJ2865]字符串识别(后缀自动机) 题面 自从有了DBZOJ 终于有地方交权限题了 题解 很明显,只出现了一次的串 在\(SAM\)的\(right/e ...
- [BZOJ1396&2865]识别子串
bzoj1396 bzoj2865 dbzoj1396 dbzoj2865 题面 XX在进行字符串研究的时候,遇到了一个十分棘手的问题. 在这个问题中,给定一个字符串\(S\),与一个整数\(K\), ...
- BZOJ1396 识别子串【SAM+SegmentTree】
BZOJ1396 识别子串 给定一个串\(s\),对于串中的每个位置,输出经过这个位置且只在\(s\)中出现一次的子串的最短长度 朴素的想法是,我们要找到那些只出现一次的子串,之后遍历每个串,把串所覆 ...
- bzoj1396: 识别子串
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...
- bzoj千题计划318:bzoj1396: 识别子串(后缀自动机 + 线段树)
https://www.lydsy.com/JudgeOnline/problem.php?id=1396 后缀自动机的parent树上,如果不是叶子节点,那么至少有两个子节点 而一个状态所代表子串的 ...
随机推荐
- java导读
导读: 我们学习Java大概有3个方向,第一,桌面系统,包括C/S结构:第二,J2ME,面向无限领域,很有潜力的家伙,看看中国的手机用户就知道了.第三,面向企业应用.计算的平台,J2EE. ...
- linux 命令实现原理
我们知道有些Linux的命令涉及到一些高效率的算法,在此做出一个积累吧,不是系统的. 1.tail命令打印一个文件的最后num行 2.grep命令从文本中匹配字符串 基于正则表达式的匹配很快. it ...
- Chapter 1 First Sight——9
One of the best things about Charlie is he doesn't hover. 一件最好的事是查理兹他不在附近. He left me alone to unpac ...
- .NET中公共变量与属性的区别
在我们的程序中经常会出现以下的代码: 如: 成员变量 public string Name; 或者用属性 private string name ...
- Android Studio 修改主题
http://jingyan.baidu.com/article/6f2f55a18040aeb5b93e6cb4.html
- Android利用canvas画各种图形 及Paint用法 .
引自:http://blog.csdn.net/carlfan/article/details/8139984 1.首先说一下canvas类: Class Overview The Canvas cl ...
- CentOS 6.5搭建Samba服务器
目标需求:在Windows7下访问CentOS 6.5 root用户桌面/ZS文件夹 0.准备工作 关闭防火墙并开启不起动 service iptables stop chkconfig iptabl ...
- ZOJ 3699 Dakar Rally(贪心)
这是一道贪心题,他的贪心思想很容易想明白,我们保证油箱里的油始终是最便宜的我们最后的花费就能是最少的.实现方法就是:比如现在在i点,我们看邮箱满载能最远到达哪里,不妨设最远到达j,(j >= i ...
- Preface
I'd never given much thought to how I would die — 我从来没有想过我会怎么样死 much thought 仔细思考 我从未仔细思考过,我将如何死去 th ...
- post(c),get(r),put(u),delete(d)
http://whui0110.iteye.com/blog/1682388看这个帖子知道人们常说的幂等意思就是可以重复执行,结果是一样的:帖子中说put(update)是幂等的,其实update v ...