【题解】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(中间有空格)。
输入样例
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的更多相关文章
- Necklace of Beads(polya计数)
Necklace of Beads Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7451 Accepted: 3102 ...
- POJ1509 Glass Beads
Glass Beads Time Limit: 3000MS Memory Limit: 10000K Total Submissions: 4314 Accepted: 2448 Descr ...
- 【POJ1509】Glass Beads
[POJ1509]Glass Beads [题目描述]给定字符串S,并规定首尾相连成环,求出最小字典序. [输入]输入有多个数据,第一行只包括正整数N,表示有N组数据.每个数据包括一行,输入该字符串. ...
- 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 ...
- hdu 1817 Necklace of Beads(Polya定理)
Necklace of Beads Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- 【BZOJ2081】[Poi2010]Beads hash+调和级数
[BZOJ2081][Poi2010]Beads Description Zxl有一次决定制造一条项链,她以非常便宜的价格买了一长条鲜艳的珊瑚珠子,她现在也有一个机器,能把这条珠子切成很多块(子串), ...
- Beads
Beads 题目描述 Zxl有一次决定制造一条项链,她以非常便宜的价格买了一长条鲜艳的珊瑚珠子,她现在也有一个机器,能把这条珠子切成很多块(子串),每块有k(k>0)个珠子,如果这条珠子的长度不 ...
- 题解【UVA10054】The Necklace
题目描述 输入格式 输出格式 题意简述 有一种由彩色珠子连接而成的项链.每个珠子的两半由不同颜色组成.如图所示,相邻两个珠子在接触的地方颜色相同.现在有一些零碎的珠子,需要确认它们是否可以复原成完整的 ...
随机推荐
- 华为Android手机打开Log
华为Android手机打开Log, 显示日志方法 今天在华为u8650上调试应用程序时,发现Eclipse的log始终无法显示,在网上找了好多资料,甚至stack overflow也查了,最后终于找到 ...
- Mysql命令收集【重要】
1.在linux上获取Mysql服务器状态,及版本: [root@host]# mysqladmin --version 结果信息: mysqladmin Ver 8.42 Distrib 5.7. ...
- 并行开发 2.task
原文:8天玩转并行开发——第二天 Task的使用 在我们了解Task之前,如果我们要使用多核的功能可能就会自己来开线程,然而这种线程模型在.net 4.0之后被一种称为基于 “任务的编程模型”所冲击, ...
- Spring-DI控制反转和IOC依赖注入
Spring-DI控制反转和IOC依赖注入 DI控制反转实例 IDEAJ自动导入Spring框架 创建UserDao.java接口 public interface UserDao { public ...
- Oracle统计分析
1.oracle11g查看自动收集统计信息是否开启 SQL> select client_name,status from dba_autotask_client; CLIENT_NAME St ...
- $NOIP2018$ 暴踩全场计划实施方案
\(NOIP2018\) 暴踩全场计划实施方案 改完题辣!该更博辣!(这么激动干嘛反正又没人看) 我要取一个霸气的名字.于是就这样了.原本打算是暴踩yyb计划实施方案的(来啊互相伤害啊) 信心流选手就 ...
- 爬虫技术:cookies池的维护
一:为什么要维护cookie 1.登录才能爬取内容 2.爬取频繁会被封号. 3.需要维护多个账号的cookie,实现大规模抓取 二:cookies的要求 1.自动登录更新 2.定期筛选验证 3.提供外 ...
- springboot2集成redis5报错:io.lettuce.core.RedisException: io.lettuce.core.RedisConnectionException: DENIED Redis is running in protected
报错信息如下: Caused by: io.lettuce.core.RedisException: io.lettuce.core.RedisConnectionException: DENIED ...
- 接口参数校验之@Valid与BindingResult
接口方法往往需要对入参做一些校验,从而判断入参是否合格,而javax.validation包为我们提供了一些常用的参数校验注解,使用起来很方便. 下面这个示例是检验入参对象中的password是否为空 ...
- MYSQL索引优化之单表示例
1. 创建表 CREATE TABLE IF NOT EXISTS `article` ( `id` BIGINT(10) NOT NULL AUTO_INCREMENT, `author_id` I ...