P3498 [POI2010]KOR-Beads(hash表)
P3498 [POI2010]KOR-Beads
题解
hash+hash表+调和级数
关于调和级数(from baidu百科):
![](https://gss0.bdstatic.com/94o3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D148/sign=0bbdefa21ece36d3a604873402f33a24/b90e7bec54e736d17f269f7090504fc2d5626994.jpg)
![](https://gss1.bdstatic.com/-vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D13/sign=8df4de518d18367aa9897bde2f73bd9d/96dda144ad3459828f12f6ea07f431adcbef8429.jpg)
是欧拉-马歇罗尼常数,而
![](https://gss0.bdstatic.com/-4o3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D14/sign=cfd895548c01a18bf4eb164b9e2fb605/30adcbef76094b36e8a30895a8cc7cd98d109d90.jpg)
约等于
![](https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D36/sign=25fd06ec4d2309f7e36fab14730eeeb0/e1fe9925bc315c605e1f789786b1cb134954773b.jpg)
,并且随着 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表)相关推荐
- 从头到尾彻底解析Hash表算法
从头到尾彻底解析Hash表算法 发布时间: 2013-10-02 10:26 阅读: 25156 次 推荐: 14 原文链接 [收藏] 作者:July.wuliming.pkuoliv ...
- 0x14.基础数据结构 — hash表与字符串hash
目录 一.Hash表 1.AcWing 137. 雪花雪花雪花 0.hash表+链表 1.字符串的最小表示法 二.字符串hashhashhash 0.AcWing 138. 兔子与兔子 1.luogu ...
- 一步一步写算法(之hash表)
[ 声明:版权全部,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] hash表,有时候也被称为散列表.个人觉得,hash表是介于链表和二叉树之间的一种中间结构.链 ...
- 转 从头到尾彻底解析Hash表算法
出处:http://blog.csdn.net/v_JULY_v. 说明:本文分为三部分内容, 第一部分为一道百度面试题Top K算法的详解:第二部分为关于Hash表算法的详细阐述:第三部 ...
- C++实现Hash表
C++实现Hash表的插入,删除,重建开放寻址法 #include<iostream> using namespace std; typedef int KeyType; / ...
- hash表建立 很久没写数据结构了
/** auhtor:lx date 4.9 2011 brief hash table */ #include <stdio.h> #include <stdlib.h> # ...
- libevent中的hash表
libevent中的hash表的代码在ht-internal文件中,在添加io事件,signal事件时,底层是在操作 event_io_map和event_signal_map 1. hash的 ...
- nginx的hash表结构
前言 ngx中的hash表有两种,一种是常规的hash表,另外一种是带有通配符的hash表(其中包含前缀通配符和后经通配符).而带通配符的hash表是基于常规hash表建立的. ngx_hash_t是 ...
- 海量路由表能够使用HASH表存储吗-HASH查找和TRIE树查找
千万别! 非常多人这样说,也包括我. Linux内核早就把HASH路由表去掉了.如今就仅仅剩下TRIE了,只是我还是希望就这两种数据结构展开一些形而上的讨论. 1.hash和trie/radix ha ...
最新文章
- 华南理工大学院长涉嫌篡改8名研究生成绩,4人已停职
- scanf函数使用遇到的问题
- Swift 协议protocol
- “自带大屏”的便利店,你见过吗?
- 一个类作为另一个类的数据成员
- javascript 对象(四)
- bcp 不能调用where 子句_三、p18-28条件查询、分组聚合、排序where/group by/having/order by...
- 转载——sunlogin远程控制安装bug解决
- java详细教程_java超详细教程适合初学者深入掌握Java知识.ppt
- matlab心电信号处理,基于MATLAB的心电信号的数字滤波处理
- 极客空间-MySQL实战45天-第二天
- 何为血缘分析?血缘分析能给我们带来什么影响?
- 商业智能系统在税务行业的应用
- java开发微信付款码支付
- mysql通过股票代码查数据_如何在交易数据中查询各个版本交易量前三的股票?(MySQL分组排名)...
- 京东阿里都已入局 顺丰在即时配送的胜算有多大?
- 会议怎样召开_是否可以仅使用免费软件来召开会议?
- vmware虚拟机安装windows server 2012 绕过秘钥安装——P2
- 实习生与公司签订三方协议的流程与操作细节指南+配图 - CQNU Deloitte
- 音视频大合集,先从零开始万事开头难
热门文章
- 微信小程序—跳一跳,Android游戏助手(外挂)使用教程
- 讲一讲短线指标运用方法 有机会大家可以试
- PDF格式分析(五十二)Digital Signatures 数字签名
- One egg donation program 一个鸡蛋项目
- toshiba 共享文件夹_东芝2051C打印机怎么连接并扫描文件到电脑?
- JAVA基础练习——30题
- 网卡驱动程序设计_设计卡
- 《谷歌宣布Chrome不再信任所有赛门铁克SSL证书》误读新闻的澄清说明
- CAS单点登录-第三方登录[QQ、微信、CSDN、GitHub](十四)
- 加薪申请函--2018加油!!!