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树上,如果不是叶子节点,那么至少有两个子节点 而一个状态所代表子串的 ...
随机推荐
- Talking about Health
George: Doctor, what is the best way to stay healthy? Dictor: Having a good diet is probably the mos ...
- 简单实现contentOS下开机自动启动tomcat
看过网上很多写tomcat开机自启动的例子,很多都是写了一个比较复杂的脚步.找到一个比较简单的. 首先编辑 vi /etc/rc.d/rc.local 在尾部加入 export JDK_HOME=/u ...
- Quartz 2D 初步
转载自:http://www.cofcool.net/development/2015/06/17/ios-study-note-six-Quartz2D/ Quartz 2D是一个二维绘图引擎,同时 ...
- [转]使用openssl库实现RSA、AES数据加密
openssl是可以很方便加密解密的库,可以使用它来对需要在网络中传输的数据加密.可以使用非对称加密:公钥加密,私钥解密.openssl提供了对RSA的支持,但RSA存在计算效率低的问题,所以一般的做 ...
- Python的import嵌套
[root@fuel ~]# vi /var/lib/docker/devicemapper/mnt/4da57a0078c9d3f32e819373b67de41da37c34a27ee03f740 ...
- [转]:如何使用Android Studio把自己的Android library分享到jCenter和Maven Central
http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0623/3097.html
- foreach的2个细节!
人生不应该在同第一个地方摔第三次.... 1. foreach的时候一定要对要遍历的元素进行null判定. 2. foreach中不要对遍历的元素进行增删改操作(问题严重) 还有一个细节: 使用了的流 ...
- 多个inline元素、block元素、inline-block元素在父容器中的换行情况
1.首先看inine元素的换行情况 <style> *{padding:0;margin:0} div.wrap{width:200px;height:200px;border:1px s ...
- Android Studio的使用(一)--显示行号、快速查找方法源
1.显示行号,只需要右击编辑窗体的边界就可以了.(这种方法只能临时显示,下次打开文件就没了,对其他文件也没用). 2.永久显示行号 3.查找某个变量.类.方法定义的源头,同时可以查找布局文件,资源文件 ...
- js timer
<html><head lang="en"> <meta charset="UTF-8"> <title>< ...