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.经过一定次数的操作 ...
随机推荐
- Java高频面试题(2023最新整理)
Java的特点 Java是一门面向对象的编程语言.面向对象和面向过程的区别参考下一个问题. Java具有平台独立性和移植性. Java有一句口号:Write once, run anywhere,一次 ...
- [网络/Java EE/Web]Tomcat/Nginx中配置全局的安全响应头(header)——X-Frame-Options / X-XSS-Protection / X-Content-Options
Step1 配置Tomcat step1.1 查看是否已配置目标的HTTP网络安全头 方式1 – Tomcat / conf/web.xml cat /opt/myTomcat/conf/web.xm ...
- 从零开始学Vue(二~三)—— Vue 实例 / 模板语法(插值、指令)
概述 vue.js作为现在笔记热门的JS框架,使用比较简单易上手,也成为很多公司首选的JS框架. 但是对于初学者可能学起来有些麻烦,所以推出<从零开始学Vue>系列博客,本系列计划推出19 ...
- 【Java SE】多线程
1.1 线程的生命周期 ![](file://D:\资料\学习笔记\Java\多线程\1.png?msec=1648087619803) 方法名 说明 yield() stop() sleep() w ...
- Unable to find real location for: <frozen codecs>
问题描述 pycharm 在debug时出现了如下bug ----------------------------------------------------------------------- ...
- ChatGPT API接口编程基础与使用技巧
总结/朱季谦 趁着这周末空闲时间,在研读完OpenAi官网文档的基础上,及时总结了这篇<ChatGPT API接口编程基础与使用技巧>. 本文大部分内容是围绕编程方面,包括ChatGPT模 ...
- .NET实现解析字符串表达式
一.引子·功能需求 我们创建了一个 School 对象,其中包含了教师列表和学生列表.现在,我们需要计算教师平均年龄和学生平均年龄. //创建对象 School school = new School ...
- ES6中新增的promise异步编程解决方案
promise异步编程解决方案 第1章 准备 1.1 区别实例对象与函数对象 (1).实例对象:通过 new 函数 产生的对象,称为实例对象,简称对象 (2).函数对象:将函数作为对象使用 ...
- Rails 中的布局和渲染
Templates, Partials, and Layouts 在 Rails 中,视图是用于呈现 HTML.XML.JSON 等响应的模板.Rails 的视图系统支持模板.局部模板和布局模板,它们 ...
- HTML中script 标签中的那些属性
在HTML中, <script> 标签用于嵌入或引用JavaScript代码. 在 <script> 标签中,有两个属性可以用来控制脚本的加载和执行方式: async 和 de ...