【BZOJ1396】识别子串 - 后缀自动机+线段树
题意:
Description

Input
Output
题解:
先建出SAM,显然right集合大小为1的子串,即在parent树上的叶子节点可以作为识别子串;
考虑一个这样的子串会对哪些区间产生影响:
设$l=max[fa[s]]$,$r=max[s]$,显然这个子串出现的位置就是$r$,所以对区间$[1,r]$都有影响;
但是其中有一段是被$fa[s]$包含的,因此贡献不同,具体来说就是:
在区间$[1,l-1]$中贡献为$r-i+1$;
在区间$[l,r]$中贡献为$r-l+1$;
这里手推一下就好;
因此开两棵线段树维护修改最小值即可。
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#include<set>
#define inf 0x7f7f7f7f
#define eps 1e-9
#define mp make_pair
using namespace std;
typedef long long ll;
typedef double db;
int n,l,r,last=,rt=,tot=,son[][],fa[],mx[];
bool ch[];
char s[];
struct seg{
int t[];
seg(){
memset(t,0x7f,sizeof(t));
}
void pd(int u){
if(t[u]!=inf){
t[u*]=min(t[u*],t[u]);
t[u*+]=min(t[u*+],t[u]);
t[u]=inf;
}
}
void updata(int l,int r,int u,int L,int R,int x){
if(L>R)return;
if(L<=l&&r<=R){
t[u]=min(t[u],x);
return;
}
pd(u);
int mid=(l+r)/;
if(L<=mid)updata(l,mid,u*,L,R,x);
if(mid<R)updata(mid+,r,u*+,L,R,x);
}
int query(int l,int r,int u,int p){
if(l==r)return t[u];
pd(u);
int mid=(l+r)/;
if(p<=mid)return query(l,mid,u*,p);
else return query(mid+,r,u*+,p);
}
}t1,t2;
void extend(int ch){
int p=last,np=++tot;
mx[np]=mx[p]+;
for(;p&&!son[p][ch];p=fa[p])son[p][ch]=np;
if(!p)fa[np]=rt;
else{
int q=son[p][ch];
if(mx[q]==mx[p]+)fa[np]=q;
else{
int nq=++tot;
mx[nq]=mx[p]+;
memcpy(son[nq],son[q],sizeof(son[q]));
fa[nq]=fa[q];
fa[q]=fa[np]=nq;
for(;p&&son[p][ch]==q;p=fa[p])son[p][ch]=nq;
}
}
last=np;
}
int main(){
scanf("%s",s);
n=strlen(s);
for(int i=;i<n;i++)extend(s[i]-'a');
for(int i=;i<=tot;i++){
if(fa[i])ch[fa[i]]=true;
}
for(int i=;i<=tot;i++){
if(!ch[i]){
l=mx[i]-mx[fa[i]],r=mx[i];
t1.updata(,n,,,l-,r+);
t2.updata(,n,,l,r,r-l+);
}
}
for(int i=;i<=n;i++){
printf("%d\n",min(t1.query(,n,,i)-i,t2.query(,n,,i)));
}
return ;
}
【BZOJ1396】识别子串 - 后缀自动机+线段树的更多相关文章
- BZOJ1396: 识别子串(后缀自动机 线段树)
题意 题目链接 Sol 后缀自动机+线段树 还是考虑通过每个前缀的后缀更新答案,首先出现次数只有一次,说明只有\(right\)集合大小为\(1\)的状态能对答案产生影响 设其结束位置为\(t\),代 ...
- bzoj1396&&2865 识别子串 后缀自动机+线段树
Input 一行,一个由小写字母组成的字符串S,长度不超过10^5 Output L行,每行一个整数,第i行的数据表示关于S的第i个元素的最短识别子串有多长. Sample Input agoodco ...
- BZOJ 1396&&2865 识别子串[后缀自动机 线段树]
Description 在这个问题中,给定一个字符串S,与一个整数K,定义S的子串T=S(i, j)是关于第K位的识别子串,满足以下两个条件: 1.i≤K≤j. 2.子串T只在S中出现过一次. 例如, ...
- BZOJ 1396 识别子串 (后缀自动机+线段树)
题目大意: 给你一个字符串S,求关于每个位置x的识别串T的最短长度,T必须满足覆盖x,且T在S中仅出现一次 神题 以节点x为结尾的识别串,必须满足它在$parent$树的子树中只有一个$endpos$ ...
- bzoj 1396/2865: 识别子串 后缀自动机+线段树
水水的字符串题 ~ #include <map> #include <cstdio> #include <cstring> #include <algorit ...
- BZOJ 1396: 识别子串( 后缀数组 + 线段树 )
这道题各位大神好像都是用后缀自动机做的?.....蒟蒻就秀秀智商写一写后缀数组解法..... 求出Height数组后, 我们枚举每一位当做子串的开头. 如上图(x, y是height值), Heigh ...
- BZOJ1396 识别子串 字符串 SAM 线段树
原文链接http://www.cnblogs.com/zhouzhendong/p/9004467.html 题目传送门 - BZOJ1396 题意 给定一个字符串$s$,$|s|\leq 10^5$ ...
- 2018.12.23 bzoj2865&&1396: 字符串识别(后缀自动机+线段树)
传送门 卡空间差评! 题意简述:给一个字串,对于每个位置求出经过这个位置且只在字串中出现一次的子串的长度的最小值. 解法:先建出samsamsam,显然只有当sizep=1size_p=1sizep ...
- bzoj1396识别子串(SAM+线段树)
复习SAM板子啦!考前刷水有益身心健康当然这不是板子题/水题…… 很容易发现只在i位置出现的串一定是个前缀串.那么对答案的贡献分成两部分:一部分是len[x]-fa~len[x]的这部分贡献会是r-l ...
随机推荐
- Nginx配置udp/tcp代理
#编译 ./configure --prefix=/servyouapp/nginx --with-stream --with-http_stub_status_module #nginx.conf部 ...
- 网络教程(7)OSI模型的低层模型
OSI Model——Open System Interconnection Model 开放系统互联模型
- HDU1114 - Piggy-Bank
Before ACM can do anything, a budget must be prepared and the necessary financial support obtained. ...
- BZOJ 3774 最优选择 (最小割+二分图)
题面传送门 题目大意:给你一个网格图,每个格子都有$a_{ij}$的代价和$b_{ij}$的回报,对于格子$ij$,想获得$b_{ij}$的回报,要么付出$a_{ij}$的代价,要么$ij$周围四联通 ...
- [luogu2216 HAOI2007] 理想的正方形 (2dST表 or 单调队列)
题目描述 有一个ab的整数组成的矩阵,现请你从中找出一个nn的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一行为3个整数,分别表示a,b,n的值 第二行至第a ...
- [TJOI2008]彩灯
线性基裸题,求最大线性无关组. 注意:1ll<<i #include <cstdio> int n,m; const int mod=2008; long long b[64] ...
- C#使用 ComboBox 控件
Combox控件是一个下拉选择的控件,再做上位机的时候会经常用到,这里记录一下我是怎么用. 1.拉出一个combox控件 2.控件属性选为不可编辑,可编辑的话,你选择下拉框的内容后可以改下拉框里的内容 ...
- JavaScript实验一(添加节点,删除节点)
静态html页面: <!DOCTYPE html> <html> <head lang="en"> <meta charset=" ...
- [SharePoint][SharePoint2013循序渐进]SPS2013简介
本章概要: 1.啥是SPS2013 2.SharePoint如何作用于团队协作和信息共享 3.SP2013有哪些用户权限 4.什么是SharePoint2013 online 5.SP在内部署和在线订 ...
- iOS相册实现与AssetsLibrary框架使用
概述 在iOS中如果想要获取手机相册里面的图片或者视频的话就要用到系统自带的AssetsLibrary框架,AssetsLibrary.framework中包含以下文件 #import <Ass ...