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.经过一定次数的操作 ...
随机推荐
- flutter widget---->Spacer
如果你想灵活控制Flex容器(Row, Column)中子组件中的间隔,可以考虑使用Spacer.下面以Row为例子,来为它的子组件添加间距. use Spacer import 'package:f ...
- webgl 系列 —— 着色器语言
其他章节请看: webgl 系列 着色器语言 本篇开始学习着色器语言 -- GLSL全称是 Graphics Library Shader Language (图形库着色器语言) GLSL 是一门独立 ...
- P/Invoke之C#调用动态链接库DLL
本编所涉及到的工具以及框架: 1.Visual Studio 2022 2..net 6.0 P/Invok是什么? P/Invoke全称为Platform Invoke(平台调用),其实际上就是一种 ...
- GitHub+Typora实现云笔记一键上传
git实现笔记自动上传功能 简介: 将更新内容自动上传同步git,无需手动提交,解锁一键式同步.流程大致为,创建新仓库,配置公钥和私钥,安装quicker软件,通过quicker上某脚本完成一键提交. ...
- vue中使用vue.extend在dom挂载vue实例
const CounterComponent = Vue.extend(Counter); this.vm = new CounterComponent({}).$mount('#container' ...
- BUU-RE-刮开有奖-WinMain
WinMain函数参数介绍 int WINAPI WinMain( HINSTANCE hInstance, // handle to current instance HINSTANCE hPrev ...
- [Linux]scp/sshpass:物理主机与虚拟机的文件传输
最初写这篇文章的时候,对 openssh大家族的工具套件(例如: ssh.sshd.ssl.scp等)不太熟悉,现在看来这个文章的标题(虚拟机与物理机)是存在问题的. 本质上,本文关心的并不是[虚拟机 ...
- Pandas的使用
在数据分析工作中,Pandas 的使用频率是很高的,一方面是因为 Pandas 提供的基础数据结构 DataFrame 与 json 的契合度很高,转换起来很方便.另一方面,如果日常的数据清理工作不是 ...
- Git代码提交规范
1. 引言 思想,因人而异,难以重复 写代码时,每个人的习惯是不一样的,所以,引入了代码规范,为了省力,引入了自动格式化代码工具,前端工程中比较典型的自动格式化代码工具如:Prettier · Opi ...
- RTSP Server(LIVE555)源码分析(二)-服务器创建
一. 设置RTSP服务器配置 步骤1.5:rtspServer_Init--->BasicTaskScheduler::createNew()时序图如下: 1)步骤1.54,BasicTaskS ...