[USACO5.1]乐曲主题Musical Themes

题目链接:戳我

Emmm......hash怎么做啊不会啊

这里是SA后缀数组版本的

就是先两两做差分,作为要处理后缀的数组。普通地求出来h数组之后,我们二分这个答案,然后判定是否合法就行了。是否合法即\(min(sa[j])+h[i]<max(sa[j]),j<=i\)

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define MAXN 100010
using namespace std;
int n,m,p;
int a[MAXN],b[MAXN],tp[MAXN],tax[MAXN],rnk[MAXN],sa[MAXN],h[MAXN];
inline void qsort()
{
    for(int i=1;i<=m;i++) tax[i]=0;
    for(int i=1;i<=n;i++) tax[rnk[i]]++;
    for(int i=1;i<=m;i++) tax[i]+=tax[i-1];
    for(int i=n;i>=1;i--) sa[tax[rnk[tp[i]]]--]=tp[i];
}
inline void suffix_sort()
{
    m=MAXN,p=0;
    for(int i=1;i<=n;i++) rnk[i]=b[i],tp[i]=i;
    qsort();
    for(int w=1;p<n;m=p,w<<=1)
    {
        p=0;
        for(int i=1;i<=w;i++) tp[++p]=n+i-w;
        for(int i=1;i<=n;i++) if(sa[i]-w>0) tp[++p]=sa[i]-w;
        qsort();
        swap(rnk,tp);
        p=rnk[sa[1]]=1;
        for(int i=2;i<=n;i++)
            rnk[sa[i]]=(tp[sa[i]]==tp[sa[i-1]]&&tp[sa[i]+w]==tp[sa[i-1]+w])?p:++p;
    }
}
inline void get_h()
{
    int j,k=0;
    for(int i=1;i<=n;i++)
    {
        if(k) k--;
        int j=sa[rnk[i]-1];
        while(b[i+k]==b[j+k]) k++;
        h[rnk[i]]=k;
    }
    // for(int i=1;i<=n;i++) printf("rnk[%d]=%d\n",i,rnk[i]);
    // for(int i=1;i<=n;i++) printf("h[%d]=%d\n",i,h[i]);
}
inline bool check(int x)
{
    int minn=n,maxx=0;
    for(int i=2;i<=n;i++)
    {
        if(h[i]>=x)
            minn=min(minn,min(sa[i],sa[i-1])),maxx=max(maxx,max(sa[i],sa[i-1]));
        if(h[i]<x||i==n)
        {
            if(minn+x-1<maxx) return true;
            minn=n,maxx=0;
        }
    }
    return false;
}
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("ce.in","r",stdin);
    #endif
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    n--;
    for(int i=1;i<=n;i++) b[i]=a[i+1]-a[i]+88;
    // for(int i=1;i<=n;i++) printf("b[%d]=%d\n",i,b[i]);
    suffix_sort();
    get_h();
    int l=0,r=n,ans;
    while(l<=r)
    {
        int mid=(l+r)>>1;
        // printf("l=%d r=%d mid=%d\n",l,r,mid);
        if(check(mid)) ans=mid,l=mid+1;
        else r=mid-1;
    }
    if(ans<4||ans>(n+1)/2) printf("0\n");
    else printf("%d\n",ans+1);
    return 0;
}

原文地址:https://www.cnblogs.com/fengxunling/p/10742888.html

时间: 2024-07-29 05:24:12

[USACO5.1]乐曲主题Musical Themes的相关文章

【POJ1743】Musical Themes 乐曲主题 后缀数组、 (也可以用hash+二分做的~)

题意: 1829: Musical Themes 乐曲主题 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 42  Solved: 15 [Submit][Status][Web Board] Description 我们用N(1 <= N <=5000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,每个数表示钢琴上的一个键.很不幸这种表示旋律的方法忽略了音符的时值,但这项编程任务是关于音高的,与时值无关. 许多作曲家围绕一个重

USACO 5.1 Musical Themes(哈希+二分)

Musical ThemesBrian Dean A musical melody is represented as a sequence of N (1 <= N <= 5000) notes that are integers in the range 1..88, each representing a key on the piano. It is unfortunate but true that this representation of melodies ignores th

Android应用开发中的风格和主题(style,themes)(转)

Android应用开发中的风格和主题(style,themes) 越来越多互联网企业都在Android平台上部署其客户端,为了提升用户体验,这些客户端都做得布局合理而且美观.......Android的Style设计就是提升用户体验的关键之一.Android上的Style分为了两个方面: Theme是针对窗体级别的,改变窗体样式: Style是针对窗体元素级别的,改变指定控件或者Layout的样式.      Android系统的themes.xml和style.xml(位于\base\core

USACO Section 5.1 Musical Themes(枚举)

直接枚举O(n^3)会TLE,只要稍微加点优化,在不可能得到更优解时及时退出.其实就是道水题,虽说我提交了6次才过= =..我还太弱了 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #include<cctype> 6 7 #define rep(i,r) for(int i=0;i<r;i++) 8 #define c

[转]jQuery EasyUI 扩展-- 主题(Themes)

主题(Themes)允许您改变站点的外观和感观.使用主题可以节省设计的时间,让您腾出更多的时间进行开发.您也可以创建一个已有主题的子主题. 主题生成器(Theme Builder) jQuery UI 主题 许多扩展的主题是基于 jQuery UI 主题创建的,它们不是官方发布的. Sunny Pepper Grinder Cupertino Dark Hive Metro 主题 下面的扩展主题是基于 Metro 主题创建的. Metro Blue Metro Gray Metro Green

Android应用开发中的风格和主题(style,themes)

http://www.cnblogs.com/playing/archive/2011/04/01/2002469.html 越来越多互联网企业都在Android平台上部署其客户端,为了提升用户体验,这些客户端都做得布局合理而且美观.......Android的Style设计就是提升用户体验的关键之一.Android上的Style分为了两个方面: Theme是针对窗体级别的,改变窗体样式: Style是针对窗体元素级别的,改变指定控件或者Layout的样式.      Android系统的the

Android中文翻译 - 主题(themes )介绍

译者注:theme(主题)和style(样式)是专用术语,下面对这两个词汇不在使用中文词汇. theme 是安卓的一种机制,用于为应用程序和activity提供一致的样式(style).样式style规范了组成用户图形接口的一些元素的可视化属性.比如颜色( color),高度,填充,字体尺寸.为了在平台中所有的APP应用之间,提供比较大的结合性.安卓提供了两个系统主题样式,这样当你构建应用时就可以选择: Holo Light Holo Dark 在帮助你构建APP时应用这些主题,适应普遍的安卓可

COGS 902 乐曲主题 题解 &amp; hash入门贺

[题意] 给定一个长为n的序列,元素都是不超过88的正整数,求序列中主题的最大长度. 所谓主题是指在序列中出现了至少两次并且不相交的子串.特别的,主题可以变调,也就是说如果一个子串全部加上或减去一个数后与另一个子串相同,那么也认为它们是相同的. 对于100%的数据,n<=5000. [解法] 所谓的变调不过是升降趋势相同,直接来一发差分就好. 答案显然有单调性,长度越长主题越不容易出现,因此可以二分答案,每次只要查询长为ans的子串中是否存在相同且不相交的两个子串即可. 查询子串是否相同可以用哈

github+hexo+themes搭建简易个性主题博客

0x00  install Node.js and git 安装Node.js:http://www.runoob.com/nodejs/nodejs-install-setup.html 安装git:下载地址:http://git-scm.com/download/ 0x01 安装Hexo 1.在D盘新建个hexo文件夹 $ cd d:/hexo $ npm install hexo-cli -g $ hexo init blog $ cd blog $ npm install $ hexo