P3498 [POI2010]KOR-Beads

题解

hash+hash表+调和级数


关于调和级数(from baidu百科):

调和级数发散的速度非常缓慢。举例来说,调和序列前10项的和还不足100。这是因为调和数列的部分和呈对数增长。特别地, [3] 
其中

 
 

是欧拉-马歇罗尼常数,而

  

约等于

  

,并且随着 k趋于正无穷而趋于 0。这个结果由欧拉给出。


在做题之前,我们需要先算算复杂度

我们至少要枚举子串的长度,并取出每个子串。

计算枚举的总复杂度

O(n+n/+n/+n/+...+n/n)(分数向下取整)== O(n*(1+/+/+/+...+/n))(分数向下取整)<= O(n*(1+1/2+1/3+1/4+...+1/n))

其中这个 1+1/2+1/3+1/4+...+1/n 通过一种叫调和级数的神奇方法可以得出

+/+/+/+...+/n ≈ ln n < log n

∴枚举的总复杂度 <= O( n log n )

所以如果比较和记录的复杂度可以达到 O(1),我们就可以轻松愉快地(大雾)过掉了。

于是我们想到用hash瞎搞

我们预处理出主串的hash值,由于子串可以翻转,所以正序逆序都要算

然后取出子串的hash值(方法见代码),扔到hash表里判重

至于怎么搞hash表,用邻接表实现就好了。

但是我们每次枚举都要先清空hash表,时间占用太大了。

于是我们可以引入一个tim数组,存下时间戳,表示枚举长度 i 时这个子串被扔进去

当 tim 不同时,说明这是上次枚举的数据,已经失效,可以直接覆盖

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int read(){
char c=getchar(); int x=;
while(c<''||c>'') c=getchar();
while(''<=c&&c<='') x=x*+c-,c=getchar();
return x;
}
typedef unsigned long long ull;
#define N 200005
const ull bs=1e9+;
const ull Ph=;
int n,ans,pos[N],tp;
int cnt,hd[Ph],nx[N*],ti[N*];
ull a[N],fac[N],h1[N],h2[N],v[N*];
void ins(ull x,int nw){
nx[++cnt]=hd[x%Ph]; hd[x%Ph]=cnt;
ti[cnt]=nw; v[cnt]=x;
}
int ask(ull x,int nw){
for(int i=hd[x%Ph];ti[i]==nw;i=nx[i])
if(v[i]==x) return ;
return ;
}
int main(){
n=read(); fac[]=;
for(int i=;i<=n;++i){
a[i]=read();
fac[i]=fac[i-]*bs;
h1[i]=h1[i-]*bs+a[i];
}
for(int i=n;i>=;--i) h2[i]=h2[i+]*bs+a[i];
for(int k=;k<=n;++k){
if(n/k<ans) break;
int tt=; cnt=;
for(int i=;i+k-<=n;i+=k){
ull p1=h1[i+k-]-h1[i-]*fac[k];
ull p2=h2[i]-h2[i+k]*fac[k];
if(ask(p1,k)&&ask(p2,k))
ins(p1,k),ins(p2,k),++tt;
}
if(tt>ans) ans=tt,pos[tp=]=k;
else if(tt==ans) pos[++tp]=k;
}sort(pos+,pos+tp+);
printf("%d %d\n",ans,tp);
for(int i=;i<=tp;++i) printf("%d ",pos[i]);
return ;
}

P3498 [POI2010]KOR-Beads的更多相关文章

  1. bzoj 2081 [Poi2010]Beads hash+调和级数

    2081: [Poi2010]Beads Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1003  Solved: 334[Submit][Statu ...

  2. 【BZOJ2081】[Poi2010]Beads hash+调和级数

    [BZOJ2081][Poi2010]Beads Description Zxl有一次决定制造一条项链,她以非常便宜的价格买了一长条鲜艳的珊瑚珠子,她现在也有一个机器,能把这条珠子切成很多块(子串), ...

  3. BZOJ 2081: [Poi2010]Beads

    Description 问把n截成每个长度后不同子串个数. Sol 调和极数+Hash. 首先这是一个式子 \(n\sum_{i=1}^n \frac {1}{i}\) . 这东西就是调和极数再乘上 ...

  4. LOJ#2427. 「POI2010」珍珠项链 Beads

    题目地址 题目链接 题解 不会算复杂度真是致命,暴力枚举k每次计算是n/2+n/3+n/4+...+1的,用调和级数算是\(O(nlogn)\)的... 如果写哈希表的话能够\(O(nlogn)\), ...

  5. BZOJ2081 : [Poi2010]Beads

    暴力枚举$k$,对于一个子串,计算它正着的hash值以及反着的hash值,取最小值得到其最终hash值. 对于$k$,一共有$\lfloor\frac{n}{k}\rfloor$个子串,计算出它们的最 ...

  6. [POI2010]Beads

    题目大意: 给定一个长度为$n(n\leq200000)$的串$S_{1\sim n}$,选择一个$l$,从$S_1$开始,将$S$分为连续的若干段,使得每一段长度为$l$.令$k$为分出来不同的子串 ...

  7. 【bzoj2081】[Poi2010]Beads Hash

    题目描述 Zxl有一次决定制造一条项链,她以非常便宜的价格买了一长条鲜艳的珊瑚珠子,她现在也有一个机器,能把这条珠子切成很多块(子串),每块有k(k>0)个珠子,如果这条珠子的长度不是k的倍数, ...

  8. POI2010题解

    POI2010题解 我也不知道我为什么就开始刷POI了 有些题目咕掉了所以不完整(我都不知道POI到底有多少题) [BZOJ2079][Poi2010]Guilds (貌似bz跟洛谷上的不是一个题?) ...

  9. Beads

    Beads 题目描述 Zxl有一次决定制造一条项链,她以非常便宜的价格买了一长条鲜艳的珊瑚珠子,她现在也有一个机器,能把这条珠子切成很多块(子串),每块有k(k>0)个珠子,如果这条珠子的长度不 ...

随机推荐

  1. UI自动化--PageObjects(页面对象)

    核心的核心:减少了重复代码的数量,减少变更涉及面:做到如果UI发生更改,则只需在一个位置应用此修复程序. PageObject:将页面作为一个对象,进行封装,包括元素定位,封装获取各元素.操作的方法: ...

  2. ubuntu16.04下安装pycharm

    下面开始教程 先在PyCharm官网下载安装包 链接:https://www.jetbrains.com/pycharm/download/#section=linux 选择平台为Linux,可以看到 ...

  3. FCoin API

    本文介绍FCoin API 介绍 通过了解以下信息,您可以方便的使用 FCoin 提供的 API 来接入 FCoin 交易平台. 认证 执行下面的代码进行用户验证: import fcoin api ...

  4. Python开发【笔记】:加锁的最佳方案

    避开死锁 代码程序中,尽量要避免死锁的产生,下面分析常见的线程锁使用方式 :注:只有同一把锁才会产生互斥 1.常见的死锁方式(加锁时程序报错,锁未释放): import time import thr ...

  5. mysql 内置功能 触发器介绍

    使用触发器可以在用户对表进行[增.删.改]操作时前后定义一些操作,注意:没有查询 创建触发器 create trigger 触发器的名字 之前(before)或者之后(after)  行为(inser ...

  6. kettle 安装mysql 驱动

    错误连接数据库 [mysql] : org.pentaho.di.core.exception.KettleDatabaseException: Error occurred while trying ...

  7. windows环境下为php打开ssh2扩展

    安装步骤 1. 下载 php extension ssh2下载地址 http://windows.php.net/downloads/pecl/releases/ssh2/0.12/ 根据自己PHP的 ...

  8. Spark2.x学习笔记:Spark SQL程序设计

    1.RDD的局限性 RDD仅表示数据集,RDD没有元数据,也就是说没有字段语义定义. RDD需要用户自己优化程序,对程序员要求较高. 从不同数据源读取数据相对困难. 合并多个数据源中的数据也较困难. ...

  9. plsql的sql窗口中文模糊查询没有作用

    环境变量新增: NLS_LANG = AMERICAN_AMERICA.AL32UTF8

  10. EXTJS4扩展实例:一个调用Ext.picker.Color的颜色选择菜单

    运行环境:Extjs4.2.1 运行效果: 调用代码: Ext.require(['MyExtend.Form.Field.ColorField']); Ext.onReady(function() ...