POJ 1743 Musical Theme Hash+二分法
标题效果:有一个美丽的旋律,它们是由一些不大于88音调。如果计为五个音调的量度,问:是否有相同的节奏的多个部分(相同的差,以及两者之间的相同的节奏不能重叠),并寻求最长长度。
思考:这个问题是八人中的问题,正解是自己主动机后缀,但我不会。
但是某神犇说过:“Hash大法好”。
于是这个题Hash+二分也能够解决。分析时间复杂度。2w个点,二分logn。hash挂链推断O(kn),总复杂度O(knlogn)。解决。
将原数组两两做差,然后依照这个数组hash。
二分枚举最长的同样的韵律长度。枚举每个開始的时间,然后推断两个韵律是否重叠,这个都放在hash表里即可了。
CODE:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define BASE 177
#define MAX 20010
using namespace std; struct HashSet{
static const int mo = 9997;
int head[mo + 100],total;
int next[MAX],pos[MAX];
unsigned long long true_hash[MAX]; void Clear() {
memset(head,0,sizeof(head));
total = 0;
}
bool Insert(unsigned long long hash,int _pos,int ans) {
int x = hash % mo;
for(int i = head[x];i;i = next[i])
if(true_hash[i] == hash && _pos - pos[i] > ans)
return true;
next[++total] = head[x];
true_hash[total] = hash;
pos[total] = _pos;
head[x] = total;
return false;
}
}map; unsigned long long p[MAX];
unsigned long long hash[MAX];
int cnt;
int _src[MAX],src[MAX]; void Pretreatment();
inline bool Judge(int ans); int main()
{
Pretreatment();
while(scanf("%d",&cnt),cnt) {
for(int i = 1;i <= cnt; ++i)
scanf("%d",&_src[i]);
for(int i = 1;i < cnt; ++i)
src[i] = _src[i + 1] - _src[i] + 88;
hash[0] = 0;
for(int i = 1;i < cnt; ++i)
hash[i] = hash[i - 1] * BASE + src[i];
int l = 0,r = cnt,ans = 0;
while(l <= r) {
int mid = (l + r) >> 1;
if(Judge(mid))
l = mid + 1,ans = mid;
else r = mid - 1;
}
ans++;
if(ans < 5) ans = 0;
printf("%d\n",ans);
}
return 0;
} void Pretreatment()
{
p[0] = 1;
for(int i = 1;i < MAX; ++i)
p[i] = p[i - 1] * BASE;
} inline bool Judge(int ans)
{
map.Clear();
for(int i = ans;i < cnt; ++i)
if(map.Insert((unsigned long long)hash[i] - hash[i - ans] * p[ans],i,ans))
return true;
return false;
}
版权声明:本文博主原创文章,博客,未经同意不得转载。
POJ 1743 Musical Theme Hash+二分法的更多相关文章
- POJ 1743 Musical Theme (Hash)
Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 33820 Accepted: 11259 D ...
- 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 (字符串HASH+二分)
Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 15900 Accepted: 5494 De ...
- poj 1743 Musical Theme (后缀数组+二分法)
Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 16162 Accepted: 5577 De ...
- [poj 1743] Musical Theme 后缀数组 or hash
Musical Theme 题意 给出n个1-88组成的音符,让找出一个最长的连续子序列,满足以下条件: 长度大于5 不重叠的出现两次(这里的出现可以经过变调,即这个序列的每个数字全都加上一个整数x) ...
- POJ 1743 Musical Theme 后缀数组 最长重复不相交子串
Musical ThemeTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://poj.org/problem?id=1743 Description ...
随机推荐
- React Native环境配置
React Native环境配置 史上最全Windows版本搭建安装React Native环境配置 配置过React Native 环境的都知道,在Windows React Native环境配置有 ...
- hadoop-1.1.2 在Windows环境下的部署
1:先安装Cygwin 参考http://blog.csdn.net/wind520/article/details/9223003 2:下载 3:解压在C:\cygwin\hadoop1 4:配置 ...
- linux 手动安装 oracle(转)
Linux下安装Oracle 11 此为参照CU论坛上的高人写的文章并结合自身环境增加了点细节性的东西 操作系统 CentOS 4.2 2.6.11.8内核 安装准备 下载Oracle11安装包 内存 ...
- 我理解设计模式C++实现观察者模式Observer Pattern
概述: 近期中国股市起起伏伏,当然了起伏就用商机,小明发现商机后果断想入市,买入了中国证券,他想在电脑client上,网页上,手机上,iPad上都能够查看到该证券的实时行情,这样的情况下我们应该怎么设 ...
- Java equals的一个坑
public class StringEqualsObject { public static void main(String[] args) { String name="Tom&quo ...
- 揭秘传智播客毕业班的超级薪水7k内幕系列II----Offer工资表5.7k,为什么不能让老师就业就业
在上海传智播客宋学生Java六期学员.在班级尚未毕业阶段,私自投递简历,而且逃课去面试,获得某国企的Offer.入职薪资5.7K,,兼有五险一金.饭补等齐全福利,因就业老师要求班级同学未毕业不要急于就 ...
- node.js基础:HTTP服务器
一个HTTP服务器响应 var http = require('http'); http.createServer(function(request,response){ response.end(' ...
- MyReport报表引擎2.0.0.0新功能
Web报表引擎:Web上的良好的打印解决方式,WinForm的打印预览体现,报表自己主动化,支持直接打印,页小计,统计,转成金额大写,一维码显示等功能,满足中国式报表的常见功能需求.Web报表编辑器: ...
- Mongodb 之insert瞬时完成,测试数据---飞天博客
这几天看mongdb官方网站,然后将执行数据.突然,我发现,该数据确实很强大,在这里说话数据.我用普通的pc机,amd双核 2.7GHz,4G内存,当然,当系统不只是在测试作为数据库server的.同 ...
- Java String 类的 equals 和 ==
public class Test_String { public static void main(String[] args) { String a = new String("aa&q ...