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 ...
随机推荐
- HDU 4951 Multiplication table 阅读题
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4951 题意:给一个P进制的乘法表.行和列分别代表0~p-1,第i行第j*2+1和第j*2+2列代表的是第i ...
- SQLServer 网络协议(一)
SQLserver现在主要的3种协议:Shared Memory.TCP/IP 和 Named Pipe SharedMemory: Shared Memory最快最简单的协议,使用SharedMem ...
- Linux下一个php+mysql+nginx构建编译(三)
在此之前一直是一个关键构建webserver.但一个关键的建筑环境都比较旧的.假定使用一个相对较新的环境,尤其是正式的server.您必须手动编译自己建(基于以下的结构linux centos6.5 ...
- ASP.NET Core 1.0 部署 HTTPS
ASP.NET Core 1.0 部署 HTTPS ASP.NET Core 1.0 部署 HTTPS (.NET Framework 4.5.1) 提示 更新时间:2016年01月23日. 在目前介 ...
- 【SICP读书笔记(三)】练习2.18 --- 表序列的reverse方法
来自练习2.18 请定义出过程reverse,它以一个表为参数,返回的表中所包含的元素与参数表相同,但排列顺序与参数表相反: (reverse (list 1 4 9 16 25)) (25 16 9 ...
- MVC 检测用户是否登录
当我们访问一个网站的需求检測用户是否已经登录(通过Session是否为null),我们知道在WebForm中能够定义一个BasePage类让他继承System.Web.UI.Page,重写它 ...
- Xamarin.Android 入门实例(4)之实现对 SQLLite 进行添加/修改/删除/查询操作
1.Main.axml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns: ...
- C#取硬盘、CPU、主板、网卡的序号 ManagementObjectSearcher
原文:C#取硬盘.CPU.主板.网卡的序号 ManagementObjectSearcher private void button1_Click(object sender, EventArgs e ...
- cygwin,在win中开发linux程序
cygwin,在win中开发linux程序 http://www.cygwin.cn/site/info/show.php?IID=1001 很多用windows的朋友不习惯于用linux的开发环境 ...
- webclient下载文件 带进度条
private void button1_Click(object sender, EventArgs e) { doDownload(textBox1.Text.Trim()); } private ...