Beads

Zxl有一次决定制造一条项链,她以非常便宜的价格买了一长条鲜艳的珊瑚珠子,她现在也有一个机器,能把这条珠子切成很多块(子串),每块有k(k>0)个珠子,如果这条珠子的长度不是k的倍数,最后一块小于k的就不要拉(nc真浪费),保证珠子的长度为正整数。 Zxl喜欢多样的项链,为她应该怎样选择数字k来尽可能得到更多的不同的子串感到好奇,子串都是可以反转的,换句话说,子串(1,2,3)和(3,2,1)是一样的。写一个程序,为Zxl决定最适合的k从而获得最多不同的子串。 例如:这一串珠子是: (1,1,1,2,2,2,3,3,3,1,2,3,3,1,2,2,1,3,3,2,1), k=1的时候,我们得到3个不同的子串: (1),(2),(3) k=2的时候,我们得到6个不同的子串: (1,1),(1,2),(2,2),(3,3),(3,1),(2,3) k=3的时候,我们得到5个不同的子串: (1,1,1),(2,2,2),(3,3,3),(1,2,3),(3,1,2) k=4的时候,我们得到5个不同的子串: (1,1,1,2),(2,2,3,3),(3,1,2,3),(3,1,2,2),(1,3,3,2)

输入

共有两行,第一行一个整数n代表珠子的长度,(n<=200000),第二行是由空格分开的颜色ai(1<=ai<=n)。

输出

也有两行,第一行两个整数,第一个整数代表能获得的最大不同的子串个数,第二个整数代表能获得最大值的k的个数,第二行输出所有的k(中间有空格)。

如果珠子不能反转,那么就可以枚举串长然后哈希暴力了(把哈希值丢进map或哈希表判重就好了).
但是现在可以反转.
不过也没有什么关系,只需用一种正反哈希之后哈希值一样的哈希方式就好了
(一开始我以为反转的意思是随意的打乱,卡了好久)

所以,可以把正反哈希值乘起来,这样就可以保证正反哈希值一样了
(还有一种做法是取正反哈希值的最小值)
然后又可以枚举串长暴力了

#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
//#include <windows.h>
using namespace std;
typedef unsigned long long  longl;
const int M=200005;
const int P=97763;
const int B=200001;
struct {longl val1[M],val2[M],mul[M];void Init(int h[],int n) {mul[0]=1;for (int i=1;i<=n;++i) mul[i]=mul[i-1]*B;for (int i=1;i<=n;++i) val1[i]=val1[i-1]*B+h[i];for (int i=n;i>=1;--i) val2[i]=val2[i+1]*B+h[i];}longl gethash(int L,int R) {longl k1=val1[R]-val1[L-1]*mul[R-L+1];longl k2=val2[L]-val2[R+1]*mul[R-L+1];return k1*k2;}longl Hash[M];int tot;int nxt[M],last[P];int Q[M],top;void insert(int st,int ed) {longl H=gethash(st,ed);int x=H%P;tot++;Q[++top]=x;nxt[tot]=last[x];Hash[tot]=H;last[x]=tot;}bool query(int st,int ed) {longl H=gethash(st,ed);int x=H%P;for (int i=last[x];i;i=nxt[i]) {if (Hash[i]==H) return true;}return false;}void clear() {while (top) last[Q[top--]]=0;tot=0;}
} form;int ans;
int K[M],tot;
int n;
void solve(int x) {form.clear();int now=0;for (int i=1;i<=n;i+=x) {if (i+x-1>n) break;if (!form.query(i,i+x-1)) {now++;form.insert(i,i+x-1);}}if (now>ans) ans=now,tot=0,K[tot++]=x;else if (now==ans) K[tot++]=x;
}int main() {scanf("%d",&n);int val[M];for (int i=1;i<=n;++i) scanf("%d",&val[i]);form.Init(val,n);for (int i=1;i<=n;++i) {if (i*ans<=n) solve(i);else break;}printf("%d %d\n",ans,tot);printf("%d",K[0]);for (int i=1;i<tot;++i) printf(" %d",K[i]);return 0;
}

POI2010 Beads相关推荐

  1. bzoj 2081 [Poi2010]Beads

    2081: [Poi2010]Beads Time Limit: 10 Sec Memory Limit: 259 MB Submit: 687 Solved: 246 [Submit][Status ...

  2. 【bzoj2081】[Poi2010]Beads Hash

    题目描述 Zxl有一次决定制造一条项链,她以非常便宜的价格买了一长条鲜艳的珊瑚珠子,她现在也有一个机器,能把这条珠子切成很多块(子串),每块有k(k>0)个珠子,如果这条珠子的长度不是k的倍数, ...

  3. BZOJ2081 [Poi2010]Beads

    我们只要暴力枚举块的大小就可以了... 枚举的总复杂度是O(n / 1 + n / 2 + n / 3 + ...) = O(n * logn)的 何如去重呢...直接暴力hash再丢进set里搞定, ...

  4. bzoj 2081: [Poi2010]Beads 哈希

    题意 Zxl有一次决定制造一条项链,她以非常便宜的价格买了一长条鲜艳的珊瑚珠子,她现在也有一个机器,能把这条珠子切成很多块(子串),每块有k(k>0)个珠子,如果这条珠子的长度不是k的倍数,最后 ...

  5. 【BZOJ2081/Poi2010】Beads

    2081: [Poi2010]Beads Time Limit: 10 Sec  Memory Limit: 259 MB                                       ...

  6. 提高篇 第二部分 字符串算法 第1章 哈希和哈希表

    浅谈字符串哈希_1264Ikaros的博客-CSDN博客_字符串哈希 图书管理-哈希表_handsome·wjc的博客-CSDN博客 字符串哈希 哈希表 - DTTTTTTT - 博客园 图书管理(L ...

  7. 重走长征路---OI每周刷题记录---4月12日 2015

    总目录详见https://blog.csdn.net/mrcrack/article/details/84471041 做题原则,找不到测评地址的题不做.2018-11-28 重走长征路---OI每周 ...

  8. LOJ#2427. 「POI2010」珍珠项链 Beads

    题目地址 题目链接 题解 不会算复杂度真是致命,暴力枚举k每次计算是n/2+n/3+n/4+...+1的,用调和级数算是\(O(nlogn)\)的... 如果写哈希表的话能够\(O(nlogn)\), ...

  9. USACO1.1 Broken Necklace (beads)

    2019独角兽企业重金招聘Python工程师标准>>> 从1到n-1,在str[i]位置分开,分别向左计数a,向右计数b,求a+b.求的最大的a+b值.如果向左走到头就循环到末尾,向 ...

最新文章

  1. debian 安装_如何在 Debian/Ubuntu 上手动安装安全更新? | Linux 中国
  2. 记录一下PHP数组数据分页的方法 array_slice() 函数的使用
  3. 用OSSIM平台轻松发现“心脏出血”漏洞
  4. 嵌入式linux 项目开发(一)——HTML编程
  5. python取文件后缀
  6. Java旅游管理系统本科生毕业设计开题报告
  7. gxworks2使用指令手册_编程软件GX-Works2简单工程功能块篇操作手册三菱GX-Works2手册 - 广州凌控...
  8. java定时器频率自定义_@Scheduled 定时器 cron表达式自定义配置
  9. 【axure手机原型】移动应用原型设计新手引导
  10. 大数据平台架构有哪些
  11. 【托业】【新托业TOEIC新题型真题】学习笔记4-题库一-P7
  12. iOS本机号码一键登录
  13. 学习编程,应该从哪里开始学习呢?
  14. 在线正则表达式解析器和可视化工具
  15. 牛客网直通BAT面试算法精讲课优惠码
  16. 用Python写一个植物大战僵尸
  17. solarwinds如何使用
  18. 历史性时刻,Python要成为TIOBE编程语言榜首?
  19. EDM邮件营销数据分析技巧分享
  20. 关于Qt翻译在Vs编辑器上面出现乱码问题

热门文章

  1. 历数两年内的重大空难事故
  2. 操作系统中断/异常-测试题
  3. vs2017试用期满后的处理
  4. 基于WebGL架构的3D可视化平台—停车场管理系统
  5. 【3D可视化】3D可视化在智慧园区的应用
  6. app_process执行java文件(三十五)
  7. 无水印保存图片_图片怎么去水印
  8. mw325r虚拟服务器,mw325r美科星怎么桥接
  9. 全球征集 | “Kaleidoverse 万千灵境”元宇宙作品设计大赛
  10. 联想V450中禁用触摸鼠标(MousePad/TouchPad)的3种方法