[POI2010]Beads
题目大意:
给定一个长度为$n(n\leq200000)$的串$S_{1\sim n}$,选择一个$l$,从$S_1$开始,将$S$分为连续的若干段,使得每一段长度为$l$。令$k$为分出来不同的子串个数(翻转后相同算作相同),求最大的$k$,以及有哪些$l$对应的答案为$k$。
思路:
枚举长度,求正反两个哈希去重。
#include<set>
#include<cstdio>
#include<cctype>
#include<vector>
typedef unsigned long long uint64;
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int N=,BASE=;
int a[N];
uint64 pow[N],h1[N],h2[N];
std::set<uint64> set;
std::vector<int> v;
inline uint64 hash1(const int &l,const int &r) {
return h1[r]-h1[l-]*pow[r-l+];
}
inline uint64 hash2(const int &l,const int &r) {
return h2[l]-h2[r+]*pow[r-l+];
}
int main() {
const int n=getint();
for(register int i=;i<=n;i++) a[i]=getint();
for(register int i=;i<=n;i++) h1[i]=h1[i-]*BASE+a[i];
for(register int i=n;i>=;i--) h2[i]=h2[i+]*BASE+a[i];
for(register int i=pow[]=;i<=n;i++) pow[i]=pow[i-]*BASE;
int ans=;
for(register int i=;ans*i<=n;i++) {
set.clear();
int tmp=;
for(register int j=;i+j-<=n;j+=i) {
const int h1=hash1(j,j+i-),h2=hash2(j,j+i-);
if(!set.count(h1)||!set.count(h2)) {
set.insert(h1),set.insert(h2);
tmp++;
}
}
if(tmp>ans) {
ans=tmp;
v.clear();
}
if(tmp==ans) v.push_back(i);
}
printf("%d %lu\n",ans,v.size());
for(register unsigned i=;i<v.size();i++) {
printf("%d%c",v[i]," \n"[i==v.size()-]);
}
return ;
}
[POI2010]Beads的更多相关文章
- 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有一次决定制造一条项链,她以非常便宜的价格买了一长条鲜艳的珊瑚珠子,她现在也有一个机器,能把这条珠子切成很多块(子串), ...
- BZOJ 2081: [Poi2010]Beads
Description 问把n截成每个长度后不同子串个数. Sol 调和极数+Hash. 首先这是一个式子 \(n\sum_{i=1}^n \frac {1}{i}\) . 这东西就是调和极数再乘上 ...
- BZOJ2081 : [Poi2010]Beads
暴力枚举$k$,对于一个子串,计算它正着的hash值以及反着的hash值,取最小值得到其最终hash值. 对于$k$,一共有$\lfloor\frac{n}{k}\rfloor$个子串,计算出它们的最 ...
- 【bzoj2081】[Poi2010]Beads Hash
题目描述 Zxl有一次决定制造一条项链,她以非常便宜的价格买了一长条鲜艳的珊瑚珠子,她现在也有一个机器,能把这条珠子切成很多块(子串),每块有k(k>0)个珠子,如果这条珠子的长度不是k的倍数, ...
- POI2010题解
POI2010题解 我也不知道我为什么就开始刷POI了 有些题目咕掉了所以不完整(我都不知道POI到底有多少题) [BZOJ2079][Poi2010]Guilds (貌似bz跟洛谷上的不是一个题?) ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- LOJ#2427. 「POI2010」珍珠项链 Beads
题目地址 题目链接 题解 不会算复杂度真是致命,暴力枚举k每次计算是n/2+n/3+n/4+...+1的,用调和级数算是\(O(nlogn)\)的... 如果写哈希表的话能够\(O(nlogn)\), ...
- Beads
Beads 题目描述 Zxl有一次决定制造一条项链,她以非常便宜的价格买了一长条鲜艳的珊瑚珠子,她现在也有一个机器,能把这条珠子切成很多块(子串),每块有k(k>0)个珠子,如果这条珠子的长度不 ...
随机推荐
- C++树的建立和遍历
#include<iostream.h> typedef char TElemtype; typedef struct Btree { TElemtype data; struct Btr ...
- HDU 4760 Good Firewall ( Trie树 )
一开始看的时候就想歪了,比赛的时候一直在YY线段树区间覆盖,然后纠结节点数太多开不下怎么办啊啊啊啊…… 然后昨天吃饭的时候也在纠结这到底是个啥题,后来发现公共前缀->前缀??!!!!->这 ...
- MySQL常用客户端 命令
登录MySQL mysql -h localhost -uroot -p 授权指定用户访问指定数据库 GRANT ALL ON cookbook.* TO 'cbuser'@'localhost' I ...
- BFC,IFC,GFC,FFC
FC的全称是:Formatting Contexts,是W3C CSS2.1规范中的一个概念.它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用. ...
- 异或值 xor
题目描述 给出一个 N 个点的带权无向图,要求从 1 号点到 N 号点的一条路径,使得路径上的边 权异或值最大. 输入格式 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M ...
- 【BZOJ 4151 The Cave】
Time Limit: 5 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 293 Solved: 144[Submit][Status][Di ...
- jquery 的ajax
一,$.get(url,[data],[callback]) 说明:url为请求地址,data为请求数据的列表(是可选的,也可以将要传的参数写在url里面),callback为请求成功后的回调函数,该 ...
- Android BroadcastReceiver使用
1. 介绍 BroadcastReceiver用于接收广播事件(Intent), 是Android四大组件之一 2. 使用 2.1 实现广播接收类 实现一个广播收类继承BroadcastReceiv ...
- VS2015开发的C++应用如何不依赖Visual C++ 2015 redistributable?
1,“项目属性,C/C++,代码生成”,“运行库改”为“多线程(/MT)”.* MT开头的是静态引用,MD开头的是动态引用,d结尾的是Debug调试版本,没有d的是Release发布版本,所以就一 共 ...
- C# Log4Net使用示例
using log4net; using log4net.Config; using System; using System.IO; namespace Three.Logging { /// &l ...