POJ 3261 字符串上的k次覆盖问题
题目大意:
给定一个数组,求一个最大的长度的子串至少出现过k次
一个子串出现多次,也就是说必然存在2个子串间的前缀长度为所求的值
通过二分答案,通过线性扫一遍,去判断出现次数,也就是说每次遇见一个height[i] , 出现次数就加1,否则重置为1
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int N = ;
int rank[N] , sa[N] , height[N];
int wa[N] , wb[N] , wsf[N] , wv[N];
int a[N]; int cmp(int *r , int a , int b , int l)
{
return r[a]==r[b] && r[a+l]==r[b+l];
} void getSa(int *r , int *sa , int n , int m)
{
int i,j,p;
int *x=wa , *y=wb , *t;
for(i= ; i<m ; i++) wsf[i]=;
for(i= ; i<n ; i++) wsf[x[i]=r[i]]++;
for(i= ; i<m ; i++) wsf[i] += wsf[i-];
for(i=n- ; i>= ; i--) sa[--wsf[x[i]]]=i; p=;
for(j= ; p<n ; j*= , m=p){
for(p= , i=n-j ; i<n ; i++) y[p++]=i;
for(i= ; i<n ; i++) if(sa[i]>=j) y[p++]=sa[i]-j; for(i= ; i<n ; i++) wv[i]=x[y[i]];
for(i= ; i<m ; i++) wsf[i]=;
for(i= ; i<n ; i++) wsf[wv[i]]++;
for(i= ; i<m ; i++) wsf[i]+=wsf[i-];
for(i=n- ; i>= ; i--) sa[--wsf[wv[i]]]=y[i]; t=x,x=y,y=t;
x[sa[]]=;
for(p= , i= ; i<n ; i++)
x[sa[i]] = cmp(y , sa[i-] , sa[i] , j)?p-:p++;
}
return ;
} void getHeight(int *r , int *sa , int n)
{
for(int i= ; i<=n ; i++) rank[sa[i]]=i;
int k=;
int j;
for(int i= ; i<n ; height[rank[i++]]=k)
for(k?k--: , j=sa[rank[i]-] ; r[i+k]==r[j+k] ; k++);
return;
} bool check(int m , int n , int k)
{
int cnt=;
for(int i= ; i<=n ; i++){
if(height[i]>=m){
cnt++;
// cout<<"here: "<<m<<" "<<sa[i]<<" "<<sa[i-1]<<endl;
if(cnt>=k) return true;
}
else {cnt=;if(cnt>=k) return true;}
}
return false;
} int main()
{
// freopen("a.in" , "r" , stdin);
int n,k;
while(~scanf("%d%d" , &n , &k))
{
int maxn = ;
for(int i= ; i<n ; i++){
scanf("%d" , a+i);
a[i]++;
maxn = max(maxn , a[i]);
}
a[n]=;
getSa(a , sa , n+ , maxn+);
getHeight(a , sa , n); int l= , r=n , ans=;
while(l <= r){
int m=(l+r)>>;
if(check(m,n,k)){
ans = m;
l=m+;
}else r=m-;
}
printf("%d\n" , ans);
}
return ;
}
POJ 3261 字符串上的k次覆盖问题的更多相关文章
- POJ 3261 可重叠的 k 次最长重复子串【后缀数组】
这也是一道例题 给定一个字符串,求至少出现 k 次的最长重复子串,这 k 个子串可以重叠.算法分析:这题的做法和上一题差不多,也是先二分答案,然后将后缀分成若干组.不同的是,这里要判断的是有没有一个组 ...
- Milk Patterns - poj 3261 (求重复k次的最长子串)
题目大意:给你一个数组,求这个数组里面至少重复k次的子串. 分析:后缀数组的练手题目...不过给的数字比较大,可以先离散化处理一下即可. 代码如下: ===================== ...
- poj 3261 后缀数组 找反复出现k次的子串(子串能够重叠)
题目:http://poj.org/problem?id=3261 仍然是后缀数组的典型应用----后缀数组+lcp+二分 做的蛮顺的,1A 可是大部分时间是在调试代码.由于模板的全局变量用混了,而自 ...
- POJ 3261 Milk Patterns (求可重叠的k次最长重复子串)+后缀数组模板
Milk Patterns Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7586 Accepted: 3448 Cas ...
- POJ 3261 可重叠k次最长重复子串
Milk Patterns Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 13127 Accepted: 5842 Ca ...
- HDU 4862 Jump(最小K路径覆盖)
输入一个n×m网格图,每个结点的值为0-9,可以从任意点出发不超过k次,走完每个点且仅访问每个结点一次,问最终的能量最大值.不可全部走完的情况输出-1. 初始能量为0. 而结点(x,y)可以跳跃到结点 ...
- POJ 3801 有上下界最小流
1: /** 2: POJ 3801 有上下界的最小流 3: 4: 1.对supersrc到supersink 求一次最大流,记为f1.(在有源汇的情况下,先使整个网络趋向必须边尽量满足的情况) 5: ...
- 网络费用流-最小k路径覆盖
多校联赛第一场(hdu4862) Jump Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- 2.在约会网站上使用k近邻算法
在约会网站上使用k近邻算法 思路步骤: 1. 收集数据:提供文本文件.2. 准备数据:使用Python解析文本文件.3. 分析数据:使用Matplotlib画二维扩散图.4. 训练算法:此步骤不适用于 ...
随机推荐
- 题解报告:hdu 1032 The 3n + 1 problem(克拉兹问题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1032 Problem Description Problems in Computer Science ...
- 建造者模式以及php实现
建造者模式: 造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对 ...
- 打包Scala jar 包的正确步骤
实验目的:打包可运行的scala jar,上传到spark集群,提交执行 1.idea中编译运行代码,可成功运行 2.修改2处代码//只配置appName,其他配置项注释掉val conf=new S ...
- android 2.2 preview3 编译bug
平台 as2.2 preview3; 1. 解决方法: 在project.buildgradle 里面设置 // Top-level build file where you can add co ...
- JavaScript——blob、file、flieReader、createObjectURL
https://blog.csdn.net/opengl_es/article/details/44336477 https://www.cnblogs.com/hhhyaaon/p/5928152. ...
- angular2快速开始
简介 5 分钟从0搭建一个ng2项目demohttps://angular.io/docs/js/latest/quickstart.html 你运气真好,竟然看到了这篇文章,你省事了,一分钟让你完成 ...
- CE工具里自带的学习工具--第一关
点击[下一步],进入第二关
- JVM中常见的垃圾收集器
垃圾收集机制是 Java 的招牌能力,极大地提高了开发效率.如今,垃圾收集几乎成为现代语言的标配,即使经过如此长时间的发展, Java 的垃圾收集机制仍然在不断的演进中,不同大小的设备.不同特征的应用 ...
- EasyUI入门,DataGrid(数据表格)
搭建EasyUI 1.进入官网,下载EasyUI的程序包.地址:http://www.jeasyui.com/download/list.php 2.先导入css样式,引入程序包 3.进入EasyUI ...
- spring springmvc 获取所有url
@Autowired private RequestMappingHandlerMapping handlerMapping; @Test public void getAllApi() { Map& ...