COGS 902 乐曲主题 题解 & hash入门贺
【题意】
给定一个长为n的序列,元素都是不超过88的正整数,求序列中主题的最大长度。
所谓主题是指在序列中出现了至少两次并且不相交的子串。特别的,主题可以变调,也就是说如果一个子串全部加上或减去一个数后与另一个子串相同,那么也认为它们是相同的。
对于100%的数据,n<=5000。
【解法】
所谓的变调不过是升降趋势相同,直接来一发差分就好。
答案显然有单调性,长度越长主题越不容易出现,因此可以二分答案,每次只要查询长为ans的子串中是否存在相同且不相交的两个子串即可。
查询子串是否相同可以用哈希实现,这样只要O(n)预处理一发h数组并递推幂取模,取hash值就果断O(1)了。
关于hash的取模,可以直接用unsigned long long自动溢出取模(虽然这是最容易被卡的hash……)。
贴个代码(也不知道出了什么事儿,莫名的折叠不了了,垃圾cnblogs):
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#define ULL unsigned long long
using namespace std;
const int maxn=;
const ULL T=173ull;
void init();
ULL hash(int,int);
ULL h[maxn],pw[maxn],tmp;
int n,a[maxn],L,R,M;
bool ok;
map<ULL,int>id;
int main(){
#define MINE
#ifdef MINE
freopen("theme.in","r",stdin);
freopen("theme.out","w",stdout);
#endif
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for(int i=n;i;i--)a[i]-=a[i-];
init();
L=;R=n;
while(L<=R){
M=(L+R)>>;
ok=false;
for(int i=;i+M-<=n;i++){
tmp=hash(i,M);
if(id.count(tmp)){
if(id[tmp]<i-M){
ok=true;
break;
}
}
else id[tmp]=i;
}
if(ok)L=M+;
else R=M-;
}
if(L<)L=;
printf("%d",L);
#ifndef MINE
printf("\n-------------------------DONE-------------------------\n");
for(;;);
#endif
return ;
}
inline void init(){
for(int i=n;i;i--)h[i]=h[i+]*T+(a[i]+);
pw[]=1ull;
for(int i=;i<=n;i++)pw[i]=pw[i-]*T;
}
inline ULL hash(int x,int l){return h[x]-h[x+l]*pw[l];}
/*
30
25 27 30 34 39 45 52 60 69 79 69 60 52 45 39 34 30 26 22 18
82 78 74 70 66 67 64 60 65 80
Answer:
9
*/
【hash相关】
虽说是抄的蓝书的hash……但不管怎么说自己算是会写hash了……好感动……
如果字符串给定,询问的串都是它的子串,那么可以O(n)预处理,O(1)查询。
具体来说,定义后缀hash函数为
hi=Tn-i+1si+Tn-isi+1+……+sn,其中T代表字符集大小。
那么利用秦九韶大法,有如下递推式:
hi=hi+1*T+si
然后就可以happy的O(n)推出所有h值啦。
查询的时候,记以x开头,长为l的子串的hash值为hash(x,l),那么有
hash(x,l)=Tlsx+Tl-1sx+1+……+sx+l-1
由上面h函数的公式,可以推出
hash(x,l)=hx-Tlhx+l
然后就可以happy的O(1)查询啦。
COGS 902 乐曲主题 题解 & hash入门贺的更多相关文章
- 主题模型 LDA 入门
主题模型 LDA 入门(附 Python 代码) 一.主题模型 在文本挖掘领域,大量的数据都是非结构化的,很难从信息中直接获取相关和期望的信息,一种文本挖掘的方法:主题模型(Topic Model ...
- TYUT程序设计入门第四讲练习题题解--数论入门
程序设计入门第四讲练习题题解--数论入门 对于新知识点的学习,需要不断地刷题训练,才能有所收获,才能更好地消化知识点. 题组链接: 程序设计入门第四讲练习题--数论 by vjudge 题解: A. ...
- [USACO 5.1.3]乐曲主题
Description 我们用N(1 <= N <=5000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,每个数表示钢琴上的一个键.很不幸这种表示旋律的方法忽略了音符的 ...
- hash入门
如果你已经确保自己的hash技巧已经入门,那么请左转这篇博文 首先介绍一下hash? 事实上是一种叫做蛤丝的病毒 以下讲到的hash都是OI中最常用到的hash方法:进制哈希 做法: 首先设一个进制数 ...
- poj1200-Crazy Search(hash入门经典)
Hash:一般是一个整数.就是说通过某种算法,可以把一个字符串"压缩" 成一个整数.一,题意: 给出两个数n,nc,并给出一个由nc种字符组成的字符串.求这个字符串中长度为n的不同 ...
- HDU 1880 字符串hash 入门题
Problem Description 哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔 ...
- 字符串hash入门
简单介绍一下字符串hash 相信大家对于hash都不陌生 翻译过来就是搞砸,乱搞的意思嘛 hash算法广泛应用于计算机的各类领域,像什么md5,文件效验,磁力链接 等等都会用到hash算法 在信息学奥 ...
- 洛谷P2743 乐曲主题Musical Themes [USACO5.1] SA
正解:SA 解题报告: 传送门 这题三个条件嘛,那就一个个考虑下都解决了就把这题解决了嘛QwQ 那就直接分别针对三个条件写下各个击破就欧克辣? 1)长度大于等于5:求出答案之后和5比大小 2)不能有公 ...
- [USACO5.1] 乐曲主题Musical Themes
题目链接:戳我 Emmm......hash怎么做啊不会啊 这里是SA后缀数组版本的 就是先两两做差分,作为要处理后缀的数组.普通地求出来h数组之后,我们二分这个答案,然后判定是否合法就行了.是否合法 ...
随机推荐
- Java包装类
自动装箱:指开发人员可以把一个基本数据类型直接赋给对应的包装类 自动拆箱:指开发人员可以把一个包装类对象直接赋给对应的基本数据类型 要把基本数据类型称为对象的时候,需要把基本数据类型进行包装, 运用: ...
- iOS / Android 移动设备中的 Touch Icons
上次转载了一篇<将你的网站打造成一个iOS Web App>,但偶然发现这篇文章的内容有些是错误的——准确来说也不是错误,只是不适合自半年前来的情况了(也可以说是iOS7 之后的时间)—— ...
- php json_decode
php代码 <?php $data='[{"Name":"a1","Number":"123","Con ...
- Could not load file or assembly Microsoft.Web.Infrastructure
Error info:Could not load file or assembly 'Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=n ...
- 为什么要使用class.forname在DriverManager.getConnection之前
JDBC在getConnection之前为什么要调用Class.forName 获取一个数据库连接的通用模板如下: String driver = "oracle.jdbc.OracleDr ...
- phpstorm webstorm安装主题 sublime样 还有都可以用的注册码
注册码 webstorm phpstorm 基本所有版本通吃 webstrom9.0.3 通过 phpstorm 8.0.1 User Name: EMBRACE License Key: ==== ...
- shell脚本笔记(原创不断记录)
今天开始自己的shell脚本练习,刚好公司有太服务器,要时间对数据的cp是按月的: 考虑:首先寻找规律,发现都放置在/opt/www/aaa/ 里面有很多的2级和3级目录和文件,但我追踪要备份的是年 ...
- HTML5+学习笔记1-------边看代码边研究中
document.addEventListener('touchstart',function(){ return false; },true); touchstart当手指触摸屏幕时候触发,即使已经 ...
- 腾讯web前端笔试题及个人答案
每道题都有答案,大多数答案亲测正确. 简答题 1.js中“5”+4=? 答案:54 2.js中void(0)=? 答案:undefined 3.js中NaN*4=? 答案:NaN 4.js中null* ...
- [机器学习]信息&熵&信息增益
关于对信息.熵.信息增益是信息论里的概念,是对数据处理的量化,这几个概念主要是在决策树里用到的概念,因为在利用特征来分类的时候会对特征选取顺序的选择,这几个概念比较抽象,我也花了好长时间去理解(自己认 ...