P3498 [POI2010]KOR-Beads 题解
前言:
最近在做哈希的题,发现了这道好题,看题解里很多大佬的方法都很巧妙,自己就发一个较为朴素的方法吧。
题意:
给你一个序列,需要求出数 k,使划分的子串长度为 k 时,不同的子串数量最多。还要注意几件事:
子串可以反转,比如 (1,2,3) 看做与 (3,2,1) 相同。
如果不能正好划分完,剩下的部分不计算。
k 可能有多个,这时要输出所有的 k,顺序任意。
最后输出两行,第一行两个数,表示最多的不同的子串数量和所有可能的 k 的数量。第二行为每一个 k。
思路:
这道题肯定要用哈希的(题目标签),因为我们要判断子串是否相同,而如果每一次都去从头到尾匹配,时间复杂度很高,一定会 TLE 飞。但如果用哈希,就可以 O(1) 比较。
不过,考虑子串可以翻转,可以做一个后缀哈希,即从后往前哈希一次,求出的哈希值即为子串反转后的哈希值。
接下来就好写了,用一个 map 来记录某个子串是否出现过,没出现过则记录并统计,最后更新答案即可。
注意每一次循环结束之后 map 要清零(因为存的是这一次的,下一次就用不到了)。
代码:
请勿抄袭。
#include<bits/stdc++.h>
#define ull unsigned long long
using namespace std;
const int base=10000007;
const int N=2e5;
int n,tot,cnt;
int a[N+10];
ull h1[N+10],h2[N+10],power[N+10];
map<ull,bool> mp;
int ans[N+10];
inline void init()
{
power[0]=1;
for(int i=1;i<=n;i++) power[i]=power[i-1]*base;
for(int i=1;i<=n;i++)
{
h1[i]=h1[i-1]*base+a[i];
}
for(int i=n;i>=1;i--)
{
h2[i]=h2[i+1]*base+a[i];
}
}
inline ull get_hash(int l,int r,bool f)
{
if(f==0) return h1[r]-h1[l-1]*power[r-l+1];
else return h2[l]-h2[r+1]*power[r-l+1];
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
init();
for(int i=1;i<=n;i++)
{
if(n/i<tot) break;
int sum=0;
for(int j=i;j<=n;j+=i)
{
int hash1=get_hash(j-i+1,j,0);
int hash2=get_hash(j-i+1,j,1);
if(!mp[hash1]&&!mp[hash2])
{
mp[hash1]=1;
mp[hash2]=1;
sum++;
}
}
if(sum>tot)
{
tot=sum;
cnt=1;
ans[cnt]=i;
}
else if(sum==tot) ans[++cnt]=i;
mp.clear();
}
printf("%d %d\n",tot,cnt);
for(int i=1;i<=cnt;i++)
{
printf("%d ",ans[i]);
}
return 0;
}
写题解不易,点个赞呗。
P3498 [POI2010]KOR-Beads 题解的更多相关文章
- P3498 [POI2010]KOR-Beads
P3498 [POI2010]KOR-Beads 题解 hash+hash表+调和级数 关于调和级数(from baidu百科): 调和级数发散的速度非常缓慢.举例来说,调和序列前10项的和还不足10 ...
- POI2010题解
POI2010题解 我也不知道我为什么就开始刷POI了 有些题目咕掉了所以不完整(我都不知道POI到底有多少题) [BZOJ2079][Poi2010]Guilds (貌似bz跟洛谷上的不是一个题?) ...
- bzoj 2081 [Poi2010]Beads hash+调和级数
2081: [Poi2010]Beads Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1003 Solved: 334[Submit][Statu ...
- 【BZOJ2081】[Poi2010]Beads hash+调和级数
[BZOJ2081][Poi2010]Beads Description Zxl有一次决定制造一条项链,她以非常便宜的价格买了一长条鲜艳的珊瑚珠子,她现在也有一个机器,能把这条珠子切成很多块(子串), ...
- 洛谷P3502 [POI2010]CHO-Hamsters感想及题解(图论+字符串+矩阵加速$dp\&Floyd$)
洛谷P3502 [POI2010]CHO-Hamsters感想及题解(图论+字符串+矩阵加速\(dp\&Floyd\)) 标签:题解 阅读体验:https://zybuluo.com/Junl ...
- LOJ#2427. 「POI2010」珍珠项链 Beads
题目地址 题目链接 题解 不会算复杂度真是致命,暴力枚举k每次计算是n/2+n/3+n/4+...+1的,用调和级数算是\(O(nlogn)\)的... 如果写哈希表的话能够\(O(nlogn)\), ...
- 【字符串】【hash】【倍增】洛谷 P3502 [POI2010]CHO-Hamsters 题解
这是一道字符串建模+图论的问题. 题目描述 Byteasar breeds hamsters. Each hamster has a unique name, consisting of lo ...
- 【bzoj2081】[Poi2010]Beads Hash
题目描述 Zxl有一次决定制造一条项链,她以非常便宜的价格买了一长条鲜艳的珊瑚珠子,她现在也有一个机器,能把这条珠子切成很多块(子串),每块有k(k>0)个珠子,如果这条珠子的长度不是k的倍数, ...
- 【题解】Beads
题目描述 Zxl有一次决定制造一条项链,她以非常便宜的价格买了一长条鲜艳的珊瑚珠子,她现在也有一个机器,能把这条珠子切成很多块(子串),每块有k(k>0)个珠子,如果这条珠子的长度不是k的倍数, ...
- 【题解】[LuoguP3503]「BZOJ2086」[POI2010] Blocks
题目描述 给出N个正整数a[1..N],再给出一个正整数k,现在可以进行如下操作:每次选择一个大于k的正整数a[i],将a[i]减去1,选择a[i-1]或a[i+1]中的一个加上1.经过一定次数的操作 ...
随机推荐
- Maven常用依赖包简单
Maven官方仓库:Maven Repository: junit » junit (mvnrepository.com) Mysql 1 <!--Mysql--> 2 <depen ...
- PHP微信三方平台-代公众号发送消息模板
1.微信三方平台代公众号实现业务接口API文档地址: https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/Offi ...
- 实现和CSS一样的easing动画?直接看Mozilla、Chromium源码!
前言 在上一篇丝滑的贝塞尔曲线:从数学原理到应用介绍贝塞尔曲线实现动画时给自己留了一个坑,实现的动画效果和CSS的transition-timing-function: cubic-bezier差别较 ...
- 四月二十二日java基础知识
1.利用接口实现类的多重继承:java语言中接口的主要作用是可以帮助实现类似于类的多重继承功能.多重继承,是指一个子类可以有一个以上的直接父类,该子类可以直接继承它所有父类的非私有成员.2.一个类实现 ...
- PMD插件:你必须掌握的代码质量工具!
当今的软件开发需要使用许多不同的工具和技术来确保代码质量和稳定性.PMD是一个流行的静态代码分析工具,可以帮助开发者在编译代码之前发现潜在的问题.在本文中,我们将讨论如何在Gradle中使用PMD,并 ...
- Vue2异步更新及nextTick原理
vue 官网中是这样描述 nextTick 的 在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,可以获取更新后的 DOM. 在学习 nextTick 是如何实现之前,我们 ...
- day14:列表/集合/字典推导式&生成器表达式&生成器函数
推导式 推导式的定义: 通过一行循环判断,遍历一系列数据的方式 推导式的语法: val for val in Iterable 三种方式: [val for val in Iterable] {val ...
- Android ViewGroup的事件分发机制-源码分析
为了更好的理解ViewGroup的事件分发机制,我们在自定义一个MyLinerLayout. public class MyLinearLayout extends LinearLayout { pr ...
- PHP大文件分割上传 PHP分片上传
这篇文章主要为大家详细介绍了PHP大文件分割上传,PHP分片上传,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 服务端为什么不能直接传大文件?跟php.ini里面的几个配置有关 upload_ma ...
- 香,一套逻辑轻松且智能解决PyQt中控件数值验证的问题
在PyQt开发中,时常需要对控件的值进行校验,如需要校验QCheckBox是否被选中,QLabel是否校验值是否为空等等.在复杂的业务场景下,这类控件如果数量很多,逐个校验就显得麻烦,需要一一获得控件 ...