【题解】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
题目描述 输入格式 输出格式 题意简述 有一种由彩色珠子连接而成的项链.每个珠子的两半由不同颜色组成.如图所示,相邻两个珠子在接触的地方颜色相同.现在有一些零碎的珠子,需要确认它们是否可以复原成完整的 ...
随机推荐
- CSS-02 BFC的理解
两个概念 感觉BFC挺重要的,于是最近查阅网上资料后小结一下,如果有不对的地方还望指正. 先理解两个概念: BOX :盒子模型 Block-Leave Box :块级元素 display属性为bloc ...
- python路径引用r的含义
input_file = r"C:\Users\Administrator\Desktop\python-master\csv\supplier_data.csv"#r代表不转义, ...
- axis2获取request方法
修改axis2的请求url-pattern 找到axis2-kernel jar包中axis2.xml配置文件的servicePath配置项,修改成与url-pattern一样的值,这样就改变了请求的 ...
- Java EE模式和MVC
Java EE模式 什么是模式? 开发过程中总结出来的约定俗成的"套路". Java EE经历的模式 model1模式 技术组成:JSP+JavaBean model1的弊端:随着 ...
- Java中避免空指针常见的方法
什么是空指针? 当一个变量的值为null时,在Java里表示一个不存在的空对象,没有实际内容,没有给它分配内存,null也是对象成员的默认值.所以,一个对象如果没有进行初始化操作,这时如果调用这个对象 ...
- centos 6.5 解压 tar
只查看 tar 文件内容而不解压 tar -tvf filename.tar 解压到指定目录(没有指定则为当前目录) tar xvf filename.tar -C /usr/file 压缩为 tar ...
- @PostMapping
@PostMapping映射一个POST请求 Spring MVC新特性 提供了对Restful风格的支持 @GetMapping,处理get请求 @PostMapping,处理post请求 @Put ...
- 浅谈SAP CRM和Hybris Commerce里的价格架构折扣
最近Jerry做了一个和价格折扣相关的原型项目,把学到的知识记录下来,以备将来查阅. 在这个原型项目里,我们用React-Native开发了一个移动应用,用户可以在手机上浏览SAP Hybris Co ...
- ASIO
{ 编译ASIO库时,出现编译警告, "Please define _WIN32_WINNT or _WIN32_WINDOWS appropriately. For example:\n& ...
- ISO C 字符串创建算符 “#”
使用用途: #define doit(name) pr_limits(#name, name) doit(RLIMIT_CORE); 这将由C预处理程序扩展为: pr_limits("RLI ...