博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【后缀数组】【二分答案】poj3261
阅读量:7104 次
发布时间:2019-06-28

本文共 1138 字,大约阅读时间需要 3 分钟。

注意:对整型数组求sa时,s[n]请置成-1。

请离散化。

可重叠的 k 次最长重复子串(pku3261)

给定一个字符串,求至少出现 k 次的最长重复子串,这 k 个子串可以重叠。
算法分析:
先二分答案,然后将后缀分成若干组。 不
同的是,这里要判断的是有没有一个组的后缀个数不小于 k。如果有,那么存在
k 个相同的子串满足条件,否则不存在。这个做法的时间复杂度为 O(nlogn)。

#include
#include
#include
using namespace std;#define N 20001struct Point{int p,v;}T[N];bool operator < (Point a,Point b){return a.v
=n?-1:y[sa[i-1]+k])==(sa[i]+k>=n?-1:y[sa[i]+k])));}void build_sa(int range){ int *x=t,*y=t2; memset(tong,0,sizeof(int)*range); for(int i=0;i
=0;--i) sa[--tong[x[i]]]=i; for(int k=1;k<=n;k<<=1) { int p=0; for(int i=n-k;i
=k) y[p++]=sa[i]-k; memset(tong,0,sizeof(int)*range); for(int i=0;i
=0;--i) sa[--tong[x[y[i]]]]=y[i]; swap(x,y); p=1; x[sa[0]]=0; for(int i=1;i
=n) break; range=p; }}void get_lcp(){ int k=0; for(int i=0;i
=K) return 1; cnt=1; } else if(lcp[i]>=x) ++cnt; } return 0;}int main(){ scanf("%d%d",&n,&K); for(int i=0;i
l) { int mid=(l+r+1>>1); if(check(mid)) l=mid; else r=mid-1; } printf("%d\n",l); return 0;}

转载于:https://www.cnblogs.com/autsky-jadek/p/4462156.html

你可能感兴趣的文章
【WPF】点击滑动条(Slider),移动滑块(Tick)到鼠标点击的位置
查看>>
[每天五分钟,备战架构师-9]数据库系统
查看>>
[转]WinForm和WebForm下读取app.config web.config 中邮件配置的方法
查看>>
HDU-1903 Exchange Rates
查看>>
ado.net entity framework使用odp.net(ODAC for .net)连接oracle11g体验
查看>>
svn怎么版本还原?
查看>>
ABP源码分析三十七:ABP.Web.Api Script Proxy API
查看>>
Quartz 定时任务管理
查看>>
大公司都有哪些开源项目~~~简化版
查看>>
java生成word的完美解决方案
查看>>
ubuntu使用记录
查看>>
java生成zip压缩文件,解压缩文件
查看>>
我的Ajax服务端框架 - 安全问题,初始化设置,实现原理
查看>>
一位程序员的十个忠告
查看>>
[转]代理(Proxy)和委派(Delegate)的区别
查看>>
【JAVASCRIPT】js知识点整理1
查看>>
两天入门五天掌握,这样的laravel别告诉我难
查看>>
老司机飙车GITC2016!金山混合云不只是获了个奖!
查看>>
PyTorch 1.0 正式发布,支持 eager 和 graph 模式无缝转换
查看>>
未来汽车横空出世,再不看你就OUT啦!
查看>>