[COGS902]乐曲主题

2024-03-10 19:32
文章标签 主题 乐曲 cogs902

本文主要是介绍[COGS902]乐曲主题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这个题一开始想的是hash+枚举长度+sort寻重 O(N2log2N)50002123108 ,但是模一个数就WA了,模两个数就T了;卡得不行不行的。
问题在于,实际上长度显然是单调合法的(如果len行,则小于len一定行),所以我们可以变枚举为二分。(宏哥Orz)
!!这也正是我没有想到的了,最近总是想着要寻找枚举顺序,改变枚举顺序;但是却忽略了寻找单调性。

#include<stdio.h>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#include<iostream>
#define P 1000000009
struct S{long long key;int r;inline bool operator < (const S a) const{return key!=a.key?key<a.key:r<a.r;}
}hash[5005];
int a[5005],N;
long long ni[2505],sum[90][2505];
inline bool check(int len){int i,k,j;k=1,hash[0]=(S){0,len-1};for(i=0;i<len;++i)hash[0].key=(hash[0].key*89+a[i])%P;for(;i<N;++i,++k)hash[k].key=((hash[k-1].key-a[i-len]*ni[len-1]%P)*89+a[i])%P,hash[k].r=i;for(i=0;i<k;++i)hash[i].key=((hash[i].key-sum[a[i]][len-1])%P+P)%P;sort(hash,hash+k),hash[k].key=-1;for(i=0;i<k;i=j){j=i+1;while(hash[j].key==hash[j-1].key)++j;if(hash[j-1].r-hash[i].r>=len)return 1;}return 0;
}
int main(){freopen("theme.in","r",stdin);freopen("theme.out","w",stdout);int i,j;scanf("%d",&N);for(i=0;i<N;++i)scanf("%d",a+i);ni[0]=1;for(i=1;i<N>>1;++i)ni[i]=ni[i-1]*89%P;for(i=88;i;--i){sum[i][0]=i;for(j=1;j<N>>1;++j)sum[i][j]=(sum[i][j-1]+i*ni[j])%P;}long long tmp;int l=5,r=(N>>1)+1;if(!check(5)){puts("0");return 0;}while(r-l>1){if(check(l+r>>1))l=l+r>>1;else r=l+r>>1;}printf("%d\n",l);
}

但是,其实模一个数是很容易被坑的,还是模两个数比较靠谱!

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int Mod[2]={100000007,86028121};
typedef long long LL;
struct HS{int data[2],i;inline bool operator < (HS a)const{return data[0]!=a.data[0]?data[0]<a.data[0]:data[1]!=a.data[1]?data[1]<a.data[1]:i<a.i;}
}hash[5000];
int a[5005],delta[5005];
int N;
LL jc[5005][2],base=175;
int cal(int l,int r,int D){LL ans=0;for(;l<r;++l)ans=(ans*base%Mod[D]+delta[l])%Mod[D];return (ans+Mod[D])%Mod[D];
}
inline bool check(int len){//printf("----------%d-------\n",len);int i,tot,D;hash[0]=(HS){0};for(i=0;i<len;++i)for(D=0;D<2;++D)hash[0].data[D]=(hash[0].data[D]*base%Mod[D]+delta[i])%Mod[D];for(D=0;D<2;++D)hash[0].data[D]=(hash[0].data[D]+Mod[D])%Mod[D];/*printf("0:");for(D=0;D<2;++D)printf("%d ",hash[0].data[D]);printf("---");for(D=0;D<2;++D)printf("%d ",cal(0,len,D));puts("");*/for(i=1;i+len<N;++i){for(D=0;D<2;++D)hash[i].data[D]=(((hash[i-1].data[D]-delta[i-1]*jc[len-1][D]%Mod[D])%Mod[D]*base%Mod[D]+delta[i+len-1])%Mod[D]+Mod[D])%Mod[D];hash[i].i=i;/*printf("%d:",i);for(D=0;D<2;++D)printf("%d ",hash[i].data[D]);printf("---");for(D=0;D<2;++D)printf("%d ",cal(i,i+len,D));puts("");*/}tot=i;sort(hash,hash+tot);int j;for(i=0;i<tot;i=j+1){j=i;while(hash[j].data[0]==hash[j+1].data[0]&&hash[j].data[1]==hash[j+1].data[1])++j;if(hash[j].i-hash[i].i>len)return 1;}return 0;
}
int main(){freopen("theme.in","r",stdin);freopen("theme.out","w",stdout);scanf("%d",&N);int i,D;for(i=0;i<N;++i)scanf("%d",a+i);for(i=0;i+1<N;++i)delta[i]=a[i+1]-a[i]+87;jc[0][0]=1,jc[0][1]=1;for(i=1;i<=N>>1;++i)for(D=0;D<2;++D)jc[i][D]=jc[i-1][D]*base%Mod[D];/*for(i=1;i<=N>>1;++i){printf("%d:",i);for(D=0;D<2;++D)printf("%d ",jc[i][D]);puts("");}*/if(!check(4)){puts("0");return 0;}int l=4,r=(N>>1)+1,mid;while(r-l>1){mid=l+r>>1;if(check(mid))l=mid;else r=mid;}printf("%d\n",l+1);
}

这篇关于[COGS902]乐曲主题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/795292

相关文章

基于Qt实现系统主题感知功能

《基于Qt实现系统主题感知功能》在现代桌面应用程序开发中,系统主题感知是一项重要的功能,它使得应用程序能够根据用户的系统主题设置(如深色模式或浅色模式)自动调整其外观,Qt作为一个跨平台的C++图形用... 目录【正文开始】一、使用效果二、系统主题感知助手类(SystemThemeHelper)三、实现细节

VitePress 自定义主题:打造专属文档网站

VitePress 是一个基于 Vite 和 Vue 3 的静态网站生成器,特别适用于撰写文档。它不仅提供了默认的主题,还允许开发者创建和使用自定义主题,以满足特定的设计和功能需求。本文将详细介绍如何创建、使用及分发 VitePress 自定义主题,并通过实例代码进行演示。 一、创建自定义主题 1. 主题文件结构 要启用自定义主题,你需要在项目根目录下的 .vitepress 文件夹中创建一

ExtJS之实现华丽的皮肤主题更换

extjs的默认皮肤很好看,但是我们还可以变换样式切换其他皮肤.   1.直接添加其他css文件换肤.好多皮肤上网就可以收到的   如皮肤文件:xtheme-olive.zip下载   把皮肤文件解压,把css文件(如xtheme-olive.css)拷贝到extjs的resources目录下css文件夹里面:      2. 解压皮肤文件,把里面的相应的 image文件夹下的目

Kafka【十二】消费者拉取主题分区的分配策略

【1】消费者组、leader和follower 消费者想要拉取主题分区的数据,首先必须要加入到一个组中。 但是一个组中有多个消费者的话,那么每一个消费者该如何消费呢,是不是像图中一样的消费策略呢?如果是的话,那假设消费者组中只有2个消费者或有4个消费者,和分区的数量不匹配,怎么办? 所以这里,我们需要学习Kafka中基本的消费者组中的消费者和分区之间的分配规则: 同一个消费者组的消费者都订

Android style(样式), theme(主题)资源

本文内容摘自《疯狂Android讲义 第三版-李刚著作》 样式和主题资源都用于对Android应用进行“美化”,只要充分利用Android应用的样式和主题资源,开发者就可以开发出各种风格的Android应用。 样式资源(style): 如果我们经常需要对某个类型的组件指定大致相似的格式,比如字体,颜色,背景色等,如果次都要为View组件重复指定这些属性,无疑会有大量的工作量,而且不利于项目后

零成本搞定静态博客——十分钟安装hugo与主题

文章目录 hugo介绍hugo安装与使用方式一:新建站点自建主题方式二:新建站点使用系统推荐的主题 hugo介绍 通过 Hugo 你可以快速搭建你的静态网站,比如博客系统、文档介绍、公司主页、产品介绍等等。相对于其他静态网站生成器来说,Hugo 具备如下特点: 1. 极快的页面编译生成速度。( ~1 ms 每页面) 2. 完全跨平台支持,可以运行在 Mac OS X, Linux

WordPressMIP主题下载,WordPress MIP与百度熊掌号改造接入(V3.4.1)

WordPressMIP主题,是基于熊掌号最新移动端主题,根据百度MIP开发规范升级改造而成,移除冗余代码,完美符合百度MIP规范的一款WordPress移动端主题。   WordPress快速引入百度MIP其实也挺简单,懂代码的人可以直接根据百度MIP官网的规范和验证提示进行原有移动端的改造,不过需要说一点的就是,那些使用自适应的网站引入MIP估计是有点繁琐,甚至基本不太可能,与其改造原

Android_主题(theme)与样式(style)

主题和样式有什么不同? 主题:Theme是针对窗体级别的,改变窗体样式。在application和activity标签下使用。 样式:Style是针对窗体元素级别的,改变指定控件或者Layout的样式。在具体控件下使用。 怎么自定义主题和样式 具体步骤: 在res/values目录下新建一个名叫style.xml的文件对于每一个主题和样式,给<style>元素增加一个全局唯一的

mac eclipse Dark 暗黑主题设置以及git字体设置

Preferences -> General -> Appearance  选择 Dark