hdu_3518_Boring counting(后缀数组)
2024-08-25 10:55:44
题意:
给你一个字符串,让你找不重叠且出现大于1次以上的字串个数
题解:
后缀数组height数组的应用,我们枚举字串的长度,然后将height数组分段,符合条件就ans++
为什么要这样做,因为height数组存的是相邻排名后缀的最大前缀数,如果height的值大于等于我们枚举的长度len,
那么有可能这一段存在有两个以上的该长度的字串,然后我们统计这个段的开头长度l和结束长度r,如果r-l>=len,说明这段必有
大于一个以上的该长度的相同子串,因为我们每次都是枚举len,按len分的段,所以不会重复。
#include<bits/stdc++.h>
#define F(i,a,b) for(int i=a;i<=b;++i)
using namespace std; namespace suffixarray{
#define FN(n) for(int i=0;i<n;i++)
const int N =1E3+;
int rnk[N],sa[N],height[N],c[N];char s[N];
void getsa(int n,int m,int *x=rnk,int *y=height){
FN(m)c[i]=;FN(n)c[x[i]=s[i]]++;FN(m)c[i+]+=c[i];
for(int i=n-;i>=;i--)sa[--c[x[i]]]=i;
for(int k=,p;p=,k<=n;k=p>=n?N:k<<,m=p){
for(int i=n-k;i<n;i++)y[p++]=i;
FN(n)if(sa[i]>=k)y[p++]=sa[i]-k;
FN(m)c[i]=;FN(n)c[x[y[i]]]++;FN(m)c[i+]+=c[i];
for(int i=n-;i>=;i--)sa[--c[x[y[i]]]]=y[i];
swap(x,y),p=,x[sa[]]=;
for(int i=;i<n;i++)
x[sa[i]]=y[sa[i-]]==y[sa[i]]&&y[sa[i-]+k]==y[sa[i]+k]?p-:p++;
}
FN(n)rnk[sa[i]]=i;
for(int i=,j,k=;i<n-;height[rnk[i++]]=k)
for(k=k?k-:k,j=sa[rnk[i]-];s[i+k]==s[j+k];k++);
}
} inline void upd(int &a,int b){if(a>b)a=b;}
inline void upu(int &a,int b){if(a<b)a=b;} using namespace suffixarray;
int main(){
while(~scanf("%s",s))
{
if(s[]=='#')break;
int len=strlen(s),ans=;
getsa(len+,);
F(i,,len)
{
int l=len+,r=;
F(j,,len)
{
if(height[j]>=i)upd(l,sa[j]),upu(r,sa[j]);
else
{
if(r-l>=i)ans++;
l=r=sa[j];
}
}
if(r-l>=i)ans++;
}
printf("%d\n",ans);
}
return ;
}
最新文章
- CSS3 速移动效果动画流畅无卡顿
- bzoj4349: 最小树形图
- 统计java中字符串,数组,集合大小(长度)
- 通过form上传文件(php)
- todoList使用教程
- javascript入门:prototype和面向对象的实现
- hibernate复合主键
- S2结业考试的第一次测验
- 01:Geoserver发布shapfile,中文字段乱码问题
- js实现快速排序(in-place)简述
- poj 1695 动态规划
- achartengine andorid图像引擎入门
- 脱壳第一讲,手工脱壳ASPack2.12的壳.ESP定律
- 第二篇-FPGA学习之RoadMap
- CAS实现单点登录--错误记录
- [转] Redux入门教程(快速上手)
- luogu3953 [NOIp2017]逛公园 (tarjan+dijkstra+记忆化搜索)
- 深入理解Java虚拟机之Java内存区域随笔
- 18) maven 项目结构:继承
- Android ListView滚动条配置完全解析
热门文章
- 根据ClassName获取元素节点
- Dev 甘特图
- 关于c语言变量的内存分布测试程序
- java URLEncoder 和Base64.encode()
- 开机启动遇到grub rescue,无法启动系统解决方法
- 触发器实现对插入数据的字段更改 Oracle+SQL Server
- mac搭建cordova的android环境
- 写了一下午的dijkstra。突然发现我写的根本不是dijkstra。。。。是没优化过的BFS.......
- java web部署问题
- 2、FileOutputStream--->;文件输出流(向文件写入数据)