后缀数组练习2:可重叠的k次最长重复子串
其实和上一题是差不多的,只是在二分check的时候有一些小小的改动
1468: 后缀数组2:可重叠的k次最长重复子串
时间限制: 1 Sec 内存限制: 128 MB
提交: 113 解决: 48
[提交] [状态] [讨论版] [命题人:admin]题目描述
【问题描述】
农夫John发现他的奶牛产奶的质量一直在变动。经过细致的调查,他发现:虽然他不能预见明天 产奶的质量,但连续的若干天的质量有很多重叠。我们称之为一个“模式”。 John的牛奶按质量可以被赋予一个0到1000000之间的数。并且John记录了N(1<=N<=20000)天的 牛奶质量值。他想知道最长的出现了至少K(2<=K<=N)次的模式的长度。 比如1 2 3 2 3 2 3 1 中 2 3 2 3出现了两次。当K=2时,这个长度为4。(可重叠的k次最长重复子串)
【输入格式】
* Line 1: 两个整数 N,K。
* Lines 2..N+1: 每行一个整数表示当天的质量值。
(多组数据)
【输出格式】
* Line 1: 一个整数:N天中最长的出现了至少K次的模式的长度
【样例】
输入:8 2
1
2
3
2
3
2
3
1
输出:4
/*后将后缀分成若干组。 不同的是,这里要判断的是有没有一个组的后缀个数不小于 k。
如果有,那么存在k 个相同的子串满足条件,否则不存在*/
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<iostream>
using namespace std;
int sa[],Rank[],rsort[];
int a[],cnt[],pos[],height[];
bool cmp(int x,int y,int k){return cnt[x]==cnt[y] && cnt[x+k]==cnt[y+k];}
void get_sa(int n,int m)
{
int k=,p=,len;
for(int i=;i<=n;i++) Rank[i]=a[i];
memset(rsort,,sizeof(rsort));
for(int i=;i<=n;i++) rsort[Rank[i]]++;
for(int i=;i<=m;i++) rsort[i]+=rsort[i-];
for(int i=n;i>=;i--) sa[rsort[Rank[i]]--]=i;
for(int k=;k<n;k<<=)
{
len=;
for(int i=n-k+;i<=n;i++) pos[++len]=i;
for(int i=;i<=n;i++) if(sa[i]>k) pos[++len]=sa[i]-k;
for(int i=;i<=n;i++) cnt[i]=Rank[pos[i]];
memset(rsort,,sizeof(rsort));
for(int i=;i<=n;i++) rsort[cnt[i]]++;
for(int i=;i<=m;i++) rsort[i]+=rsort[i-];
for(int i=n;i>=;i--) sa[rsort[cnt[i]]--]=pos[i];
for(int i=;i<=n;i++) cnt[i]=Rank[i];
p=; Rank[sa[]]=;
for(int i=;i<=n;i++)
{
if(!cmp(sa[i],sa[i-],k)) p++;
Rank[sa[i]]=p;
}
if(p==n) break; m=p;
}
a[]=; sa[]=;
}
void get_he(int n)
{
int j,k=;
for(int i=;i<=n;i++)
{
j=sa[Rank[i]-];
if(k) k--;
while(a[j+k]==a[i+k]) k++;
height[Rank[i]]=k;
}
}
bool check(int mid,int n,int k)
{
int sum=;
for(int i=;i<=n;i++)
{
if(height[i]>=mid)/*满足条件*/
{
sum++;/*个数增加*/
if(sum==k) return true;/*如果满足条件就直接返回*/
}
else sum=;/*否则重新找*/
}
return false;
}
int main()
{
int n,k;
while(scanf("%d%d",&n,&k)!=EOF)
{
for(int i=;i<=n;i++) scanf("%d",&a[i]);
get_sa(n,); get_he(n);
int l=,r=n,ans=;
while(l<=r)
{
int mid=(l+r)/;
if(check(mid,n,k))
{
ans=mid;
l=mid+;
}
else r=mid-;
}
printf("%d\n",ans);
}
return ;
}
Tristan Code
后缀数组练习2:可重叠的k次最长重复子串的更多相关文章
- POJ 3261 Milk Patterns (后缀数组,求可重叠的k次最长重复子串)
Milk Patterns Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 16742 Accepted: 7390 Ca ...
- 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: 16430 Accepted: 7252 Ca ...
- poj 3261 求可重叠的k次最长重复子串
题意:求可重叠的k次最长重复子串的长度 链接:点我 和poj1743差不多 #include<cstdio> #include<iostream> #include<al ...
- 【POJ 3261】Milk Patterns 可重叠的k次最长重复子串
可重叠的k次最长重复子串 #include<cstdio> #include<cstring> #include<algorithm> using namespac ...
- POJ 3261 可重叠的 k 次最长重复子串【后缀数组】
这也是一道例题 给定一个字符串,求至少出现 k 次的最长重复子串,这 k 个子串可以重叠.算法分析:这题的做法和上一题差不多,也是先二分答案,然后将后缀分成若干组.不同的是,这里要判断的是有没有一个组 ...
- poj3261 Milk Patterns 后缀数组求可重叠的k次最长重复子串
题目链接:http://poj.org/problem?id=3261 思路: 后缀数组的很好的一道入门题目 先利用模板求出sa数组和height数组 然后二分答案(即对于可能出现的重复长度进行二分) ...
- [Poj3261] [Bzoj1717] [后缀数组论文例题,USACO 2006 December Gold] Milk Patterns [后缀数组可重叠的k次最长重复子串]
和上一题(POJ1743,上一篇博客)相似,只是二分的判断条件是:是否存在一段后缀的个数不小于k #include <iostream> #include <algorithm> ...
- 后缀数组--可重叠的K次最长重复子串(POJ3261)
题目:Milk Patterns #include <stdio.h> #include <string.h> #define N 1000010 int wa[N],wb[N ...
随机推荐
- Http协议三次握手和四次挥手
TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种标示: SYN(synchronous建立联机) ACK(acknowledgemen ...
- CF1204A
CF1204A. BowWow and the Timetable 题意: 给你一个2进制数,求这个2进制数在10进制中的 $ 4^i $ 的个数. 解法: 其实就是 $ \ulcorner_{\lo ...
- 黑马vue---15、使用v-model实现简易计算器
黑马vue---15.使用v-model实现简易计算器 一.总结 一句话总结: 用v-model绑定了第一个数,第二个数,操作符,和结果,数据改变他们跟着变,他们变数据也跟着变 select v-mo ...
- nginx 的使用
nginx 反向代理,并拥有其高效的性能,并发效果好,是解决跨域最好的选择 nginx 的使用 1. 下载:在官网上下载 window 系统的 nginx 网址:http://nginx.org/en ...
- CentOS 7服务器下Nginx安装配置
一.安装编译工具及库文件 $ yum -y install make zlib zlib-devel gcc gcc-c++ libtool openssl openssl-devel pcre pc ...
- babel 实践
一.@babel/core var babel = require("@babel/core");babel.transform(code, options, function(e ...
- android Api操作SQLite数据库的示例代码
import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.databa ...
- PCL中有哪些可用的PointT类型(1)
博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=266 为了涵盖能想到的所有可能的情况,PCL中定义了大量的point类型.下 ...
- 科大讯飞sdk语音合成工具类
注:主要是dll文件的配置 A:Java SDK 使用了 JNI 形式,在初始化 SDK 时,SDK 将加载共享库(Windows下为msc32.dll或msc64.dll文件,Linux下libms ...
- Jenkins+Ansible+Gitlab自动化部署三剑客
一.gitlab安装 环境:centos 7 x64 1.关闭防火墙 systemctl stop firewalld systemctl disable firewalld 2.禁用selinux ...