【POJ】1743 Musical Theme
http://poj.org/problem?id=1743
题意:不可重叠最长重复子串,n<=20000,具体看《后缀数组》-- 罗穗骞
#include <cstdio>
#include <algorithm>
using namespace std; const int N=20015;
void sort(int *x, int *y, int *sa, int n, int m) {
static int c[N], i;
for(i=0; i<m; ++i) c[i]=0;
for(i=0; i<n; ++i) c[x[y[i]]]++;
for(i=1; i<m; ++i) c[i]+=c[i-1];
for(i=n-1; i>=0; --i) sa[--c[x[y[i]]]]=y[i];
}
void hz(int *r, int *sa, int n, int m) {
static int t1[N], t2[N];
static int *x, *y, *t, j, i, p=0;
x=t1; y=t2;
for(i=0; i<n; ++i) x[i]=r[i], y[i]=i;
sort(x, y, sa, n, m);
for(j=1, p=1; p<n; j<<=1, m=p) {
p=0;
for(i=n-j; i<n; ++i) y[p++]=i;
for(i=0; i<n; ++i) if(sa[i]-j>=0) y[p++]=sa[i]-j;
sort(x, y, sa, n, m);
for(t=x, x=y, y=t, x[sa[0]]=0, p=1, i=1; i<n; ++i)
x[sa[i]]=y[sa[i]]==y[sa[i-1]]&&y[sa[i]+j]==y[sa[i-1]+j]?p-1:p++;
}
}
void geth(int *a, int *sa, int *rank, int *h, int n) {
static int k, i, j; k=0;
for(i=1; i<=n; ++i) rank[sa[i]]=i;
for(i=1; i<=n; h[rank[i++]]=k)
for(k?--k:0, j=sa[rank[i]-1]; a[i+k]==a[j+k]; ++k);
}
const int oo=~0u>>2;
int sa[N], rank[N], h[N], n, a[N];
bool check(int k) {
int mx=sa[1], mn=sa[1];
for(int i=2; i<=n; ++i) {
if(h[i]>=k) {
mx=max(mx, sa[i]);
mn=min(mn, sa[i]);
if(mx-mn>=k) return 1;
}
else mx=sa[i], mn=sa[i];
}
return 0;
}
int main() {
while(scanf("%d", &n), n) {
scanf("%d", &a[1]); --n;
for(int i=1; i<=n; ++i) scanf("%d", &a[i+1]), a[i]=a[i+1]-a[i]+100;
hz(a, sa, n+1, 200);
geth(a, sa, rank, h, n);
int mid, l=0, r=n/2;
while(l<=r) {
mid=(l+r)>>1;
if(check(mid)) l=mid+1;
else r=mid-1;
}
if(l>=5) printf("%d\n", l);
else puts("0");
}
return 0;
}
经典题....我们求出height数组后,按二分的大小k分组。即每个组里的height值都要>=k,然后看每个块是否有sa值之差>=k的即可
(吐槽:poj不能用bits/stdc++.h啊啊啊啊啊啊ce了两发啊...
【POJ】1743 Musical Theme的更多相关文章
- 【后缀数组】【二分答案】【差分】poj1743 Musical Theme
差分消除加减一个值得影响,貌似r二分上界要设成(n-2)/2?为啥? sa求不可重叠最长重复子串 给定一个字符串,求最长重复子串,这两个子串不能重叠.算法分析:这题比上一题稍复杂一点.先二分答案,把题 ...
- POJ 1743 Musical Theme 【后缀数组 最长不重叠子串】
题目冲鸭:http://poj.org/problem?id=1743 Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Su ...
- 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:主题在文本串中重复出现 ...
- 【Android】自带Theme
[Android]自带Theme android之uses-permission 在编写Android程序时经常会忘记添加权限,下面是网上收集的关于Android uses-permission的 ...
- 【POJ】1704 Georgia and Bob(Staircase Nim)
Description Georgia and Bob decide to play a self-invented game. They draw a row of grids on paper, ...
- 【POJ】1067 取石子游戏(博弈论)
Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后 ...
- Poj 1743——Musical Theme——————【后缀数组,求最长不重叠重复子串长度】
Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 22499 Accepted: 7679 De ...
随机推荐
- Linux jstack命令详解
jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息. 如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack ...
- python如何获取某模块的版本信息
1)module.__version__ 2)用dir(module)查看有没有版本信息 3)help(module)
- 10 Python Optimization Tips and Issues
转自: http://www.algorithm.co.il/blogs/computer-science/10-python-optimization-tips-and-issues/
- iOS 和 Android 触摸事件传递
先看文章,写得很好 ios 触摸事件传递 http://www.cnblogs.com/Quains/p/3369132.html 另外一篇 http://blog.csdn.net/yongyinm ...
- Linux删除乱码文件
2015年2月28日 17:11:54 1. ls -i 列出文件的inode号 ??Φ-ͦ?+?-ˬͩ-????-??.doc 2. find folder -inum -delete -de ...
- 通过Java反射来理解泛型的本质
集合框架中经常会使用泛型指定集合中所存放元素的类型,保证集合的统一性,从集合中取出元素的时候也避免了类型强制转换的操作,所以我们使用常规的方式来往集合中存放元素的时候,如果指定泛型,那么我们只能向集合 ...
- EZ的间谍网络(codevs 4093)
由于外国间谍的大量渗入,学校安全正处于高度的危机之中.YJY决定挺身而作出反抗.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手 ...
- 多源最短路(codevs 1077)
题目描述 Description 已知n个点(n<=100),给你n*n的方阵,a[i,j]表示从第i个点到第j个点的直接距离. 现在有Q个询问,每个询问两个正整数,a和b,让你求a到b之间的最 ...
- Android实现圆形圆角图片
本文主要使用两种方法实现图形圆角图片 自定View加上使用Xfermode实现 Shader实现 自定View加上使用Xfermode实现 /** * 根据原图和变长绘制圆形图片 * * @param ...
- 二、JavaScript语言--JS基础--JavaScript进阶篇--流程控制语句
1.if语句--做判断 if语句是基于条件成立才执行相应代码时使用的语句. 语法: if(条件) { 条件成立时执行代码} 注意:if小写,大写字母(IF)会出错! 假设你应聘web前端技术开发岗位, ...