题目描述

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(中间有空格)。

输入样例

21

1 1 1 2 2 2 3 3 3 1 2 3 3 1 2 2 1 3 3 2 1

输出样例

6 1

2

题解

这题需要用字符串Hash和Hash表结合。

因为可以反转,所以我们要正倒序都求一遍Hash值,然后放到Hash表即可。

这里提一个细节:我们每次可以判断当前最多的不同子串数是否小于之前求的最多的不同子串数,如果小于,则不用继续判断了。这样不仅省时间,而且也会减少Hash表内的元素数量,从而减少空间,减少冲突概率。

#include <iostream>
#include <cstdio> #define MAX_N (200000 + 5) using namespace std; typedef unsigned long long ull;
typedef const unsigned long long cull; struct Node
{
int nxt;
ull val;
}; int n;
int a[MAX_N];
cull b = ;
ull pb[MAX_N], h1[MAX_N], h2[MAX_N];
const int mod = ;
int hd[mod + ], tot;
Node l[MAX_N << ];
int ans, cnt;
int k[MAX_N]; inline ull Value(int lt, int rt)
{
return min(h1[rt] - h1[lt - ] * pb[rt - lt + ], h2[lt] - h2[rt + ] * pb[rt - lt + ]);
} inline void Add(ull val)
{
l[++tot].val = val;
l[tot].nxt = hd[val % mod];
hd[val % mod] = tot;
return;
} bool Check(ull val)
{
for(register int i = hd[val % mod]; i; i = l[i].nxt)
{
if(l[i].val == val) return false;
}
Add(val);
return true;
} int main()
{
scanf("%d", &n);
for(register int i = ; i <= n; ++i)
{
scanf("%d", a + i);
}
pb[] = ;
for(register int i = , j = n; i <= n; ++i, --j)
{
pb[i] = pb[i - ] * b;
h1[i] = h1[i - ] * b + a[i];
h2[j] = h2[j + ] * b + a[j];
}
int tmp;
for(register int i = ; i <= n; ++i)
{
if(n / i < ans) break;
tmp = ;
for(register int j = ; j + i - <= n; j += i)
{
if(tmp + (n - j + ) / i < ans) break;
if(Check(Value(j, j + i - ))) ++tmp;
}
if(tmp > ans)
{
ans = tmp;
cnt = ;
k[cnt] = i;
}
else if(tmp == ans)
{
k[++cnt] = i;
}
}
printf("%d %d\n", ans, cnt);
for(register int i = ; i <= cnt; ++i)
{
printf("%d", k[i]);
if(i < cnt) putchar(' ');
}
return ;
}

参考程序

【题解】Beads的更多相关文章

  1. Necklace of Beads(polya计数)

    Necklace of Beads Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7451   Accepted: 3102 ...

  2. POJ1509 Glass Beads

    Glass Beads Time Limit: 3000MS   Memory Limit: 10000K Total Submissions: 4314   Accepted: 2448 Descr ...

  3. 【POJ1509】Glass Beads

    [POJ1509]Glass Beads [题目描述]给定字符串S,并规定首尾相连成环,求出最小字典序. [输入]输入有多个数据,第一行只包括正整数N,表示有N组数据.每个数据包括一行,输入该字符串. ...

  4. POI2010题解

    POI2010题解 我也不知道我为什么就开始刷POI了 有些题目咕掉了所以不完整(我都不知道POI到底有多少题) [BZOJ2079][Poi2010]Guilds (貌似bz跟洛谷上的不是一个题?) ...

  5. bzoj 2081 [Poi2010]Beads hash+调和级数

    2081: [Poi2010]Beads Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1003  Solved: 334[Submit][Statu ...

  6. hdu 1817 Necklace of Beads(Polya定理)

    Necklace of Beads Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  7. 【BZOJ2081】[Poi2010]Beads hash+调和级数

    [BZOJ2081][Poi2010]Beads Description Zxl有一次决定制造一条项链,她以非常便宜的价格买了一长条鲜艳的珊瑚珠子,她现在也有一个机器,能把这条珠子切成很多块(子串), ...

  8. Beads

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

  9. 题解【UVA10054】The Necklace

    题目描述 输入格式 输出格式 题意简述 有一种由彩色珠子连接而成的项链.每个珠子的两半由不同颜色组成.如图所示,相邻两个珠子在接触的地方颜色相同.现在有一些零碎的珠子,需要确认它们是否可以复原成完整的 ...

随机推荐

  1. Mysql命令收集【重要】

    1.在linux上获取Mysql服务器状态,及版本: [root@host]# mysqladmin --version 结果信息: mysqladmin  Ver 8.42 Distrib 5.7. ...

  2. Asp.Netcore使用Filter来实现接口的全局异常拦截,以及前置拦截和后置拦截

    原文链接:https://blog.csdn.net/qq_38762313/article/details/85234594 全局异常拦截器:       解决写每个接口都需要去做容错而添加try{ ...

  3. JavaScript中的map()函数

    概述Array.map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值,同时不会改变原来的数组. 用法 Array.map(callback); 示例 //简单数组 const ...

  4. 从0构建webpack开发环境(三) 开发环境以及 webpack-dev-server 的使用

    sourceMap 实际应用开发过程中大部分时间都是处于开发模式中,其中需要频繁的修改代码.调试和打包. 但是打包后的代码多个模块压缩到了一个bundle文件,如果出现警告或者异常很难定位到具体模块和 ...

  5. Vue 踩坑日志 - 有关路由传参的坑

    1.有关路由传参 vue中当通过params传过去的参数刷新页面以后会消失,所以可以用query传参.但此时又会出现另一个坑,刷新后数据仍在.但这是针对单个的某个变量的. 如果传入一个对象的话,刷新页 ...

  6. 2018-8-10-win10-uwp-毛玻璃

    title author date CreateTime categories win10 uwp 毛玻璃 lindexi 2018-08-10 19:16:50 +0800 2018-2-13 17 ...

  7. Linux就该这么学08学习笔记

    参考链接:https://www.linuxprobe.com/chapter-08.html 防火墙管理工具 众所周知,相较于企业内网,外部的公网环境更加恶劣,罪恶丛生.在公网与企业内网之间充当保护 ...

  8. Git--09 创建Maven项目

    目录 1. 创建Maven项目 2.创建Maven私服nexus 01. 部署Maven 02. 编译测试 03. 部署Tomcat及数据库 04. 创建一个jeesns项目 05. Jenkins创 ...

  9. spark 计算结果写入mysql 案例及常见问题解决

    package com.jxd import org.apache.spark.SparkContextimport org.apache.spark.SparkConfimport java.sql ...

  10. spring 整合rabbitMQ

    <!-- 配置邮件消息队列监听 --> <bean id="maillistener" class="cn.xdf.wlyy.listener.Mail ...