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树上,如果不是叶子节点,那么至少有两个子节点 而一个状态所代表子串的 ...
随机推荐
- 고 해서: 表示在做B的各种理由中, A是代表性的理由
1. 날씨도 좋고해서 산책이나 하려고 해요. 2. 할 일도 없고해서 일찍 돌어왔어요. 3. 기분도 우울하고 해서 친구란 술 마시기로 했어요. 可以加过去式和将来时使用 1. 수업도 끝 ...
- Linux 挂载aliyun数据盘
适用系统:Linux(Redhat , CentOS,Debian,Ubuntu) * Linux的云服务器数据盘未做分区和格式化,可以根据以下步骤进行分区以及格式化操作. 下面的操作将会把数据盘划 ...
- android点滴之HandlerThread的用法
转载请注明出处:http://blog.csdn.net/lskshz/article/details/25364909 一.介绍 HandlerThread继承自Thread,当线程开启时,也就是它 ...
- 2016青岛网络赛 Barricade
Barricade Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Proble ...
- mysql查询数据库约束
SELECT * FROM information_schema.`TABLE_CONSTRAINTS` where TABLE_SCHEMA='mold' and TABLE_NAME='tplmi ...
- 原创:运行loadtest时报错the load test results repository was created with a previous version and is not compatible
如果run setting中的Storage Type设置为DataBase,则需要设置数据库来保存loadtest的运行结果,如下图所示 图:Storage Type设置为DataBase 图:在M ...
- L11,one good turn deserves another
one good turn deserves another 礼尚往来 gets a good salary 有一份很好的薪水 never pays it back 从不归还 deserve 应得的 ...
- webapp之路--之必备知识
移动设备的用户越来越多,每天android手机的激活量都已经超过130万台,所以我们面向移动终端的WebAPP也开始跟进了.本文主要介绍webapp的开发与调试的相关知识和经验,以及给出几种可选的解决 ...
- Struts2--模块包含
login.xml: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUB ...
- 提示:ArcGIS version not specified. You must call RuntimeManager.Bind before creating any ArcGIS components.错误
ArcGIS10,然后就使用VS创建一个简单的AE应用程序,然后拖放一个toolbar.LicenseControl以及MapControl控件. 接着编译应用程序,编译成功. 然后单击F5运行程序, ...