[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)个珠子,如果这条珠子的长度不 ...
随机推荐
- Linux下通过tcpdump抓包工具获取信息
介绍 tcpdump是网络数据包截获分析工具.支持针对网络层.协议.主机.网络或端口的过滤.并提供and.or.not等逻辑语句帮助去除无用的信息. tcpdump - dump traffic on ...
- nosetests
1.nosetests 执行出测试报告 提前安装 插件nose-html系列插件 nosetests -v --with-html-output --html-out-file=报告名.html ...
- (转)KlayGE游戏引擎 :高效的GBUFFER管理方式
转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=3304 个顶点.这样的数据对GPU来说是很头疼的.所以引擎往往需要在Buffer上做一些工作来 ...
- Nginx下配置codeigniter框架
原来在winserver+Apache环境下工作良好的一个微信公众号后台迁移到阿里云(环境:Ubuntu 64位 | PHP5.4 | Nginx1.6)下却频出 404,403,只能访问CI rou ...
- 【python基础】--常用数据结构
list tuple dict set四种常用数据结构 list list 有序的集合,可以随时添加.删除其中元素值; 支持list嵌套模式, >>> p = ['a','b']&g ...
- ocrosoft Contest1316 - 信奥编程之路~~~~~第三关 问题 I: 寻找大富翁
http://acm.ocrosoft.com/problem.php?cid=1316&pid=8 题目描述 浙江杭州某镇共有n个人,请找出该镇上的前m个大富翁. 输入 输入包含多组测试用例 ...
- crond守护进程
Linux系统任务计划/etc/crontab cron的主配置文件,可以定义PATHcron格式如下:# .----------------分钟 (0 - 59)# | .------------- ...
- 第一次使用iptables
sudo iptables -A OUTPUT -m cgroup ! --cgroup 0x100001 -j DROP 第一次使用iptables就把电脑弄得上不了网了...... 下面这个地址讲 ...
- hdu 1195 Open the Lock (BFS)
Open the Lock Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- [AT2698] Don't Be a Subsequence
题目大意:给定一个字符串,求一个最短的串要求没有在该字符串的子串中出现过,如果有多个,输出字典序最小的那一个. 题解:倒着跑一遍原字符串(以下编号为$1\sim n$),按出现了所有$26$个字母来分 ...