P3498 [POI2010]KOR-Beads

题解

hash+hash表+调和级数


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

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

 

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

  

约等于

  

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


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

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

计算枚举的总复杂度

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

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

1+1/2+1/3+1/4+...+1/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=0;while(c<'0'||c>'9') c=getchar();while('0'<=c&&c<='9') x=x*10+c-48,c=getchar();return x;
}
typedef unsigned long long ull;
#define N 200005
const ull bs=1e9+7;
const ull Ph=13357771;
int n,ans,pos[N],tp;
int cnt,hd[Ph],nx[N*2],ti[N*2];
ull a[N],fac[N],h1[N],h2[N],v[N*2];
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 0;return 1;
}
int main(){n=read(); fac[0]=1;for(int i=1;i<=n;++i){a[i]=read();fac[i]=fac[i-1]*bs;h1[i]=h1[i-1]*bs+a[i];}for(int i=n;i>=1;--i) h2[i]=h2[i+1]*bs+a[i];for(int k=1;k<=n;++k){if(n/k<ans) break;int tt=0; cnt=0;for(int i=1;i+k-1<=n;i+=k){ull p1=h1[i+k-1]-h1[i-1]*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=1]=k;else if(tt==ans) pos[++tp]=k;}sort(pos+1,pos+tp+1);printf("%d %d\n",ans,tp);for(int i=1;i<=tp;++i) printf("%d ",pos[i]);return 0;
}

转载于:https://www.cnblogs.com/kafuuchino/p/9601263.html

P3498 [POI2010]KOR-Beads(hash表)相关推荐

  1. 从头到尾彻底解析Hash表算法

    从头到尾彻底解析Hash表算法 发布时间: 2013-10-02 10:26  阅读: 25156 次  推荐: 14   原文链接   [收藏]   作者:July.wuliming.pkuoliv ...

  2. 0x14.基础数据结构 — hash表与字符串hash

    目录 一.Hash表 1.AcWing 137. 雪花雪花雪花 0.hash表+链表 1.字符串的最小表示法 二.字符串hashhashhash 0.AcWing 138. 兔子与兔子 1.luogu ...

  3. 一步一步写算法(之hash表)

    [ 声明:版权全部,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] hash表,有时候也被称为散列表.个人觉得,hash表是介于链表和二叉树之间的一种中间结构.链 ...

  4. 转 从头到尾彻底解析Hash表算法

    出处:http://blog.csdn.net/v_JULY_v.   说明:本文分为三部分内容,     第一部分为一道百度面试题Top K算法的详解:第二部分为关于Hash表算法的详细阐述:第三部 ...

  5. C++实现Hash表

    C++实现Hash表的插入,删除,重建开放寻址法 #include<iostream>   using namespace std;      typedef int KeyType; / ...

  6. hash表建立 很久没写数据结构了

    /** auhtor:lx date 4.9 2011 brief hash table */ #include <stdio.h> #include <stdlib.h> # ...

  7. libevent中的hash表

    libevent中的hash表的代码在ht-internal文件中,在添加io事件,signal事件时,底层是在操作  event_io_map和event_signal_map 1. hash的 ...

  8. nginx的hash表结构

    前言 ngx中的hash表有两种,一种是常规的hash表,另外一种是带有通配符的hash表(其中包含前缀通配符和后经通配符).而带通配符的hash表是基于常规hash表建立的. ngx_hash_t是 ...

  9. 海量路由表能够使用HASH表存储吗-HASH查找和TRIE树查找

    千万别! 非常多人这样说,也包括我. Linux内核早就把HASH路由表去掉了.如今就仅仅剩下TRIE了,只是我还是希望就这两种数据结构展开一些形而上的讨论. 1.hash和trie/radix ha ...

最新文章

  1. 华南理工大学院长涉嫌篡改8名研究生成绩,4人已停职
  2. scanf函数使用遇到的问题
  3. Swift 协议protocol
  4. “自带大屏”的便利店,你见过吗?
  5. 一个类作为另一个类的数据成员
  6. javascript 对象(四)
  7. bcp 不能调用where 子句_三、p18-28条件查询、分组聚合、排序where/group by/having/order by...
  8. 转载——sunlogin远程控制安装bug解决
  9. java详细教程_java超详细教程适合初学者深入掌握Java知识.ppt
  10. matlab心电信号处理,基于MATLAB的心电信号的数字滤波处理
  11. 极客空间-MySQL实战45天-第二天
  12. 何为血缘分析?血缘分析能给我们带来什么影响?
  13. 商业智能系统在税务行业的应用
  14. java开发微信付款码支付
  15. mysql通过股票代码查数据_如何在交易数据中查询各个版本交易量前三的股票?(MySQL分组排名)...
  16. 京东阿里都已入局 顺丰在即时配送的胜算有多大?
  17. 会议怎样召开_是否可以仅使用免费软件来召开会议?
  18. vmware虚拟机安装windows server 2012 绕过秘钥安装——P2
  19. 实习生与公司签订三方协议的流程与操作细节指南+配图 - CQNU Deloitte
  20. 音视频大合集,先从零开始万事开头难

热门文章

  1. 微信小程序—跳一跳,Android游戏助手(外挂)使用教程
  2. 讲一讲短线指标运用方法 有机会大家可以试
  3. PDF格式分析(五十二)Digital Signatures 数字签名
  4. One egg donation program 一个鸡蛋项目
  5. toshiba 共享文件夹_东芝2051C打印机怎么连接并扫描文件到电脑?
  6. JAVA基础练习——30题
  7. 网卡驱动程序设计_设计卡
  8. 《谷歌宣布Chrome不再信任所有赛门铁克SSL证书》误读新闻的澄清说明
  9. CAS单点登录-第三方登录[QQ、微信、CSDN、GitHub](十四)
  10. 加薪申请函--2018加油!!!