POJ 1743 - Musical Theme 最长不重叠重复子串
题意:
给出一列数据,问你其中重复的最长连续子串的长度
但是有要求:
1. 长度至少为 5 .
2. 两串可以不相等,但两串每个对应位置的数字相减差值固定 (即相同变化)
分析:
因为子串变化相同,故可先把原数组前后相减, 则求出差值数组的最长重复子串的长度再 +1 就是答案.
最长重复子串的长度:
使用后缀数组.
先将问题变为判定是否存在长度为 x 的重复子串,再用二分寻找答案.
用 height数组 将长度大于 x 的划为同区,则每个区里的每个后缀的公共前缀至少为 x
再找每个区的后缀的 sa 的最大值和最小值,若最大值和最小值之差不小于x,那两个后缀的公共前缀则不重叠,即有解
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = ;
struct SuffixArray
{
int wa[MAXN], wb[MAXN], wsf[MAXN], wv[MAXN]; int Cmp(int r[], int a, int b, int k)
{
return r[a] == r[b] && r[a+k] == r[b+k];
}
void GetSa(int r[], int sa[], int n, int m)
{
int i, j, p, *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;
for (p = 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];
swap(x, y);
x[sa[]] = ;
for (p = i = ; i < n; i++)
x[sa[i]] = Cmp(y, sa[i-], sa[i], j) ? p - : p++;
}
}
void GetHeight(int r[], int sa[], int rnk[], int height[], int n)
{
int i, j, k = ;
for (i = ; i <= n; i++)
rnk[sa[i]] = i;
for (i = ; i < n; i++)
{
if (k) k--;
j = sa[rnk[i]-];
while (r[i+k] == r[j+k]) k++;
height[rnk[i]] = k;
}
}
}suffixArray;
int r[MAXN], sa[MAXN], rnk[MAXN], height[MAXN];
int s[MAXN];
int n; bool Query(int x)
{
int Min, Max;
Min = Max = sa[];
for(int i = ; i < n; i++)
{
if(height[i] >= x)
{
Min = min(Min, sa[i]);
Max = max(Max, sa[i]);
if(Max - Min >= x) return ;
}
else Min = Max = sa[i];
}
return ;
}
int solve(int l,int r)
{
int mid,pos;
while(l<=r)
{
int mid=(l+r)>>;
if(Query(mid)) pos=mid,l=mid+;
else r=mid-;
}
return pos;
}
int main()
{
while(~scanf("%d",&n) && n)
{
for (int i = ; i < n; i++) scanf("%d",&s[i]);
n--;
for (int i = ; i < n; i++)
r[i] = s[i+] - s[i] + ;
r[n] = ;
suffixArray.GetSa(r,sa,n+,);
suffixArray.GetHeight(r,sa,rnk,height,n);
int l = , r = n;
int ans = solve(l, r) + ;
printf("%d\n", ans < ? : ans);
}
}
POJ 1743 - Musical Theme 最长不重叠重复子串的更多相关文章
- POJ 1743 Musical Theme 后缀数组 不可重叠最长反复子串
二分长度k 长度大于等于k的分成一组 每组sa最大的和最小的距离大于k 说明可行 #include <cstdio> #include <cstring> #include & ...
- POJ 1743 Musical Theme (后缀数组,求最长不重叠重复子串)(转)
永恒的大牛,kuangbin,膜拜一下,Orz 链接:http://www.cnblogs.com/kuangbin/archive/2013/04/23/3039313.html Musical T ...
- poj 1743 Musical Theme(最长重复子串 后缀数组)
poj 1743 Musical Theme(最长重复子串 后缀数组) 有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一个重复 ...
- Poj 1743 Musical Theme (后缀数组+二分)
题目链接: Poj 1743 Musical Theme 题目描述: 给出一串数字(数字区间在[1,88]),要在这串数字中找出一个主题,满足: 1:主题长度大于等于5. 2:主题在文本串中重复出现 ...
- POJ 1743 Musical Theme 【后缀数组 最长不重叠子串】
题目冲鸭:http://poj.org/problem?id=1743 Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Su ...
- POJ 1743 Musical Theme 后缀数组 最长重复不相交子串
Musical ThemeTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://poj.org/problem?id=1743 Description ...
- poj1743 Musical Theme 后缀数组的应用(求最长不重叠重复子串)
题目链接:http://poj.org/problem?id=1743 题目理解起来比较有困难,其实就是求最长有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1 ...
- poj 1743 后缀数组 求最长不重叠重复子串
题意:有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一个重复的主题. “主题”是整个音符序列的一个子串,它需要满足如下条件:1 ...
- Poj 1743——Musical Theme——————【后缀数组,求最长不重叠重复子串长度】
Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 22499 Accepted: 7679 De ...
随机推荐
- ICP编程软件配置(烧写KEIL编译后的bin文件)
1. 安装NuMicro_ICP_Programming_Tool_1.29.6425软件 2. 打开软件后选择目标芯片后点击“连接”按钮 3. 添加程序 4. 点击设定按钮进行设定 5. 点击开始 ...
- TCP的长连接与短连接
1.TCP连接 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接,如图所示: (1)第一次握手:建立连接,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEN ...
- 在Web开发方面Java跟PHp八大对比
在Web开发方面Java跟PHp八大对比 <本文摘自百度经验,用来简单对比一下这两种语言> 一. 语言比较 PHP是解释执行的服务器脚本语言,首先php有简单容易上手的特点.语法和c语言比 ...
- 很强的PHP图片处理类
/*** 基本图片处理,用于完成图片缩入,水印添加* 当水印图超过目标图片尺寸时,水印图能自动适应目标图片而缩小* 水印图可以设置跟背景的合并度** Copyright(c) 2005 by ustb ...
- (翻译玩)SQLALchemy backref章节文档
Linking Relationships with Backref 自从在Object Relational Tutorial中第一次提到backref参数后,许多案例中也用到了backref,那么 ...
- Python socket 广播信息到所有连接的客户端
Python3,多线程,多客户端,广播数据 #!/usr/bin/env python3 import time import threading import queue import socket ...
- production stage
MP:mass production 批量生产 DV design verification 设计验证 EV engineering verification 工程样品验证 PV process ve ...
- Java学习笔记--PriorityQueue(优先队列)(堆)
PriorityQueue(优先队列)实际上是一个堆(不指定Comparator时默认为最小堆)队列既可以根据元素的自然顺序来排序,也可以根据 Comparator来设置排序规则.队列的头是按指定排序 ...
- Selenium2Library+ride学习笔记
一.环境部署 1.安装python2.7编译环境.ride环境以及Selenium2Library环境,环境部署可参见前面几节. 2.启动RIDE编译环境,导入Selenium2Library库. ...
- BZOJ1116: [POI2008]CLO
1116: [POI2008]CLO Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 565 Solved: 303[Submit][Status] ...