POJ-1743 Musical Theme(后缀数组)
题目大意:给一个整数序列,找出最长的连续变化相同的、至少出现两次并且不相重叠一个子序列。
题目分析:二分枚举长度进行判定。
代码如下:
- # include<iostream>
- # include<cstdio>
- # include<cstring>
- # include<algorithm>
- using namespace std;
- # define mid (l+(r-l)/2)
- const int N=20000;
- int SA[N+5],height[N+5];
- int *rk,*tSA;
- int n,a[N+5],cnt[N+5];
- bool same(int i,int j,int k)
- {
- if(tSA[i]!=tSA[j]) return false;
- if(i+k>=n&&j+k>=n) return true;
- if(i+k>=n&&j+k<n) return false;
- if(i+k<n&&j+k>=n) return false;
- return tSA[i+k]==tSA[j+k];
- }
- void buildSA()
- {
- int m=180;
- for(int i=0;i<m;++i) cnt[i]=0;
- for(int i=0;i<n;++i) ++cnt[rk[i]=a[i]];
- for(int i=1;i<m;++i) cnt[i]+=cnt[i-1];
- for(int i=n-1;i>=0;--i) SA[--cnt[rk[i]]]=i;
- for(int k=1;k<n;k<<=1){
- int p=0;
- for(int i=n-k;i<n;++i) tSA[p++]=i;
- for(int i=0;i<n;++i) if(SA[i]>=k) tSA[p++]=SA[i]-k;
- for(int i=0;i<m;++i) cnt[i]=0;
- for(int i=0;i<n;++i) ++cnt[rk[tSA[i]]];
- for(int i=1;i<m;++i) cnt[i]+=cnt[i-1];
- for(int i=n-1;i>=0;--i) SA[--cnt[rk[tSA[i]]]]=tSA[i];
- swap(rk,tSA);
- p=1;
- rk[SA[0]]=0;
- for(int i=1;i<n;++i){
- if(same(SA[i],SA[i-1],k)) rk[SA[i]]=p-1;
- else rk[SA[i]]=p++;
- }
- if(p>=n) break;
- m=p;
- }
- }
- void getHeight()
- {
- for(int i=0;i<n;++i) rk[SA[i]]=i;
- int k=0;
- height[0]=0;
- for(int i=0;i<n;++i){
- if(rk[i]==0) k=0;
- else{
- if(k) --k;
- int j=SA[rk[i]-1];
- while(i+k<n&&j+k<n&&a[i+k]==a[j+k]) ++k;
- height[rk[i]]=k;
- }
- }
- }
- bool ok(int x)
- {
- int maxn=SA[0],minn=SA[0];
- for(int i=1;i<n;++i){
- if(minn+x<maxn) return true;
- if(height[i]>=x){
- maxn=max(maxn,SA[i]);
- minn=min(minn,SA[i]);
- }else{
- maxn=minn=SA[i];
- }
- }
- return minn+x<maxn;
- }
- void init()
- {
- rk=new int[n+5];
- tSA=new int[n+5];
- }
- void destroy()
- {
- delete []rk;
- delete []tSA;
- }
- int main()
- {
- while(scanf("%d",&n)&&n)
- {
- init();
- for(int i=0;i<n;++i){
- scanf("%d",a+i);
- --a[i];
- }
- --n;
- int temp=a[0];
- for(int i=0;i<n;++i){
- a[i]=a[i+1]-temp+87;
- temp=a[i+1];
- }
- buildSA();
- getHeight();
- //二分枚举最短的不满足条件的
- int l=4,r=n;
- while(l<r){
- if(ok(mid)) l=mid+1;
- else r=mid;
- }
- printf("%d\n",l>=5?l:0);
- destroy();
- }
- return 0;
- }
POJ-1743 Musical Theme(后缀数组)的更多相关文章
- Poj 1743 Musical Theme (后缀数组+二分)
题目链接: Poj 1743 Musical Theme 题目描述: 给出一串数字(数字区间在[1,88]),要在这串数字中找出一个主题,满足: 1:主题长度大于等于5. 2:主题在文本串中重复出现 ...
- POJ 1743 Musical Theme 后缀数组 最长重复不相交子串
Musical ThemeTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://poj.org/problem?id=1743 Description ...
- poj 1743 Musical Theme (后缀数组+二分法)
Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 16162 Accepted: 5577 De ...
- Poj 1743 Musical Theme(后缀数组+二分答案)
Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 28435 Accepted: 9604 Descri ...
- [poj 1743] Musical Theme 后缀数组 or hash
Musical Theme 题意 给出n个1-88组成的音符,让找出一个最长的连续子序列,满足以下条件: 长度大于5 不重叠的出现两次(这里的出现可以经过变调,即这个序列的每个数字全都加上一个整数x) ...
- POJ 1743 Musical Theme ——后缀数组
[题目分析] 其实找最长的不重叠字串是很容易的,后缀数组+二分可以在nlogn的时间内解决. 但是转调是个棘手的事情. 其实只需要o(* ̄▽ ̄*)ブ差分就可以了. 背板题. [代码] #include ...
- POJ 1743 Musical Theme ( 后缀数组 && 最长不重叠相似子串 )
题意 : 给 n 个数组成的串,求是否有多个“相似”且不重叠的子串的长度大于等于5,两个子串相似当且仅当长度相等且每一位的数字差都相等. 分析 : 根据题目对于 “ 相似 ” 串的定义,我们可以将原 ...
- POJ.1743.Musical Theme(后缀数组 倍增 二分 / 后缀自动机)
题目链接 \(Description\) 给定一段数字序列(Ai∈[1,88]),求最长的两个子序列满足: 1.长度至少为5 2.一个子序列可以通过全部加或减同一个数来变成另一个子序列 3.两个子序列 ...
- POJ 1743 Musical Theme 后缀数组 不可重叠最长反复子串
二分长度k 长度大于等于k的分成一组 每组sa最大的和最小的距离大于k 说明可行 #include <cstdio> #include <cstring> #include & ...
- poj 1743 Musical Theme 后缀自动机/后缀数组/后缀树
题目大意 直接用了hzwer的题意 题意:有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一个重复的主题."主题&qu ...
随机推荐
- iOS - OC NSStream 文件流
前言 @interface NSStream : NSObject @interface NSOutputStream : NSStream 1.文件流的使用 NSString *filePath = ...
- Java开发高薪之路__大纲篇
本人小白,现对java开发做出以下总结,内容将从初级开始,逐步完善与摸索. 基础篇 网页篇 Android篇 高级建设篇 数据篇 系统篇
- Http协议总结
Http协议(Hyper Text Transfer Protocol)是目前网络上使用最广泛的,面向应用层的协议.它基于传输层的TCP协议进行通信.它是一种通用的,无状态的协议(不对当前的状态进行记 ...
- APP成功上线前的bug解决方案
首先测试用例设计阶段,设计并维护一个各个功能入口的说明文档.其实这个文档的作用很大,一方面对于bug回归阶段的人来说,这是用于提醒的;另外一个方面,在随机测试的时候,随机程度也能有所提高,测试人员能够 ...
- reg.test is not a function 报错
正则中 比如 var reg = "/^[0-9]$/" 会报 reg.test is not a function 如果 var reg = /^[0-9]$/ 就不会有错 因为 ...
- EaseType缓动函数
http://sol.gfxile.net/interpolation/ 一篇很详细的图文
- 【CSS3】标签使用说明
转换(transform):改变元素的形状.大小和位置. transform:rotate(20deg):顺时针旋转20° rotate()用来2D旋转改变角度.支持负数,表示逆时针. transfo ...
- 动态规划(一)——最长公共子序列和最长公共子串
注: 最长公共子序列采用动态规划解决,由于子问题重叠,故采用数组缓存结果,保存最佳取值方向.输出结果时,则自顶向下建立二叉树,自底向上输出,则这过程中没有分叉路,结果唯一. 最长公共子串采用参考串方式 ...
- 读javascript高级程序设计01-基本概念、数据类型、函数
一. javascript构成 1.javascript实现由三部分组成: ECMAScript:核心语言功能 DOM:文档对象模型,提供访问和操作网页内容的方法和接口 BOM:浏览器对象模型,提供与 ...
- DbUtils常用API的使用 方便以后查阅
package com.lizhou.Test; import java.sql.SQLException; import java.util.List; import java.util.Map; ...