Description

Alex喜欢玩网络游戏,认为这是智力和体力的综合锻炼。在一次游戏活动中,他意外获得了一个传说中威力极其强大的法宝:珠链。 
珠链,顾名思义,就是由许多小珠子串起来的一条链。珠子有很多种颜色。Alex听说过,只有将珠链打磨纯净,珠链才能发挥最大的威力。 
纯净珠链是指这样的珠链:它可以分成若干个长度相等的段,使任何两段的任何相同位置的珠子的颜色均不同,相同位置指珠子在段内的相对位置相同;而且每段的长度以及划分的段数也是有规范的,Alex记得,每段包含的珠子数目必须在L到R之间,而且划分的段数不能少于S。 
所谓打磨,就是从珠链的首和尾拿掉连续的若干个珠子。打磨后的纯净珠链的威力等于它的每个珠子具有的魔力值之和。一个珠子的魔力值只与它在打磨前的珠链中的位置有关。在查找和分析了大量实验数据以后,Alex发现珠子的魔力值等于珠子原来位置编号的约数个数! 
兴奋不已的Alex想将珠链打磨成威力最大的纯净珠链。然而,马上要参加期末考试的Alex来不及计算了,你能否帮助Alex算出最大的威力值呢? 
 

Input

第一行是四个整数N, L, R, S。 
第二行是一个长度等于N的字符串,表示Alex得到的珠链。字符串的第i个字符表示珠链的第i个珠子的颜色。相同字母表示相同颜色。珠子的位置从1编号到N。 
1 ≤ N ≤ 500,000,1 ≤ L, R, S ≤ N, 0 ≤ R – L ≤ 10. 输入的字符串只包含大写和小写的英文字母。字母区分大小写。
 

Output

输出一行,表示打磨后的纯净珠链的最大威力值。如果无法打磨成满足要求的纯净珠链,输出 -1. 
 

Sample Input

7 2 3 2
abcbcaa

Sample Output

15
【样例解释】
能够打磨出的合乎要求的纯净珠链有三种:bc/aa, abc/bca和bcb/caa。其中威力最大的是第三种,其威力值等于2+2+3+2+4+2 = 15。
如果给出的珠链是纯净珠链,那么可以不打磨。纯净珠链必须能划分成不少于S个等长的段且每段长度在L到R之间。
 
因为R-L+1<=10,所以我们可以枚举每一段的长度。
对于“任何两段的任何相同位置的珠子的颜色均不同”,我们按模x分类,计算出每个位置上一个和它颜色相同的位置,那么一段珠子能包含的最左端点就是一个区间的最大值。
然后滑动一下窗口即可。
#include<cstdio>
#include<cctype>
#include<queue>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
using namespace std;
inline int read() {
int x=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
typedef long long ll;
const int maxn=500010;
int n,s,S[maxn],Q[maxn],ans=-1;
int f[maxn],g[maxn],A[maxn],last[55];
char str[maxn];
int idx(char c) {return (c>='a'&&c<='z')?c-'a':c-'A'+26;}
ll solve(int x) {
rep(i,0,x-1) {
for(int j=i;j<n;j+=x) f[j]=last[A[j]],last[A[j]]=j;
for(int j=i;j<n;j+=x) last[A[j]]=-1;
}
int l=1,r=0;
rep(i,0,n-1) {
while(l<=r&&f[Q[r]]<f[i]) r--;Q[++r]=i;
while(Q[l]<=i-x) l++;
if(i>=x-1) g[i-x+1]=f[Q[l]];
}
rep(i,0,x-1) {
l=i;
for(int j=i;j+x-1<n;j+=x) {
while(l<=g[j]) l+=x;
if(j-l>=(s-1)*x) ans=max(ans,S[j+x]-S[l]);
}
}
}
int main() {
int l,r;
memset(last,-1,sizeof(last));
n=read();l=read();r=read();s=read();
rep(i,1,n) for(int j=i;j<=n;j+=i) S[j]++;
rep(i,2,n) S[i]+=S[i-1];
scanf("%s",str);
rep(i,0,n-1) A[i]=idx(str[i]);
rep(i,l,r) solve(i);
printf("%d\n",ans);
return 0;
}

  

BZOJ4532: [BeiJing2014 WinterCamp] 珠链的更多相关文章

  1. BZOJ4533 [BeiJing2014 WinterCamp] 数据

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. 基于ubuntu16.04部署IBM开源区块链项目-弹珠资产管理(Marbles)

    前言 本教程基本上是对Marbles项目的翻译过程. 如果英文比较好的话,建议根据官方操作说明,一步步进行环境部署.当然你也可以参考本教程在自己的主机上部署该项目. Marbles 介绍 关于 Mar ...

  4. HDU 5730 - Shell Necklace

    题意: 给出连续的1-n个珠子的涂色方法 a[i](1<=i<=n), 问长度为n的珠链共有多少种涂色方案 分析: 可以得到DP方程: DP[n] = ∑(i=1,n) (DP[n-i]* ...

  5. 琐事集 vol 2

    vol 2-0 宝宝,你是不是该看书咯? 她正瘫在沙发上看剧 我刚提起看书,她惊恐地看了看我 然后眼白一翻,彻底地瘫平了 宝宝? “宝宝睡着了.” 你下周就要考护师了!很难得,她认真地睁开眼,信誓旦旦 ...

  6. 2018天梯赛第一次训练题解和ac代码

    随着评讲的进行代码和题解会逐步放上来 2018天梯赛第一次训练 1001 : 进制转换 Time Limit(Common/Java):1000MS/10000MS     Memory Limit: ...

  7. 舞蹈链 DLX

    欢迎访问——该文出处-博客园-zhouzhendong 去博客园看该文章--传送门 舞蹈链是一个非常玄学的东西…… 问题模型 精确覆盖问题:在一个01矩阵中,是否可以选出一些行的集合,使得在这些行的集 ...

  8. HDU 3980 (SG 环变成链 之前的先手变成后手)

    题意 两个人在一个由 n 个玻璃珠组成的一个圆环上玩涂色游戏,游戏的规则是: 1.每人一轮,每轮选择一个长度为 m 的连续的.没有涂过色的玻璃珠串涂色 2.不能涂色的那个人输掉游戏 Aekdycoin ...

  9. 洛谷 P4205 [NOI2005]智慧珠游戏 DFS

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P4205 [NOI2005]智慧珠游戏 题目描述 智慧 ...

随机推荐

  1. Asyncio中的Task管理

    #!/usr/bin/env python # -*- coding: utf-8 -*- import asyncio import datetime import time from random ...

  2. Oracle优化的几个简单步骤

    数据库优化的讨论可以说是一个永恒的主题.资深的Oracle优化人员通常会要求提出性能问题的人对数据库做一个statspack,贴出数据库配置等等.还有的人认为要抓出执行最慢的语句来进行优化.但实际情况 ...

  3. Intellij Idea 使用

    一.使用前需要修改的配置: 1.当类实现Serializable接口时,自动生成 serialVersionUID 1)Setting->Inspections->java->Ser ...

  4. WPF线程(Step1)——Dispatcher

    使用WPF开发时经常会遇上自己建立的线程需要更新界面UI内容,从而导致的跨线程问题. 异常内容: 异常类型:System.InvalidOperationException 异常描述: "S ...

  5. 信号量互斥,王明学learn

    信号量互斥 信号量(又名:信号灯)与其他进程间通信方式不大相同,主要用途是保护临界资源(进程互斥).进程可以根据它判定是否能够访问某些共享资源.除了用于访问控制外,还可用于进程同步. 一.信号量分类 ...

  6. 应用程序调试工具gdb,王明学learn

    应用程序调试工具gdb学习使用 一.GDB简介 GDB 是 GNU 发布的一款功能强大的程序调试工具.GDB 主要完成下面三个方面的功能: 1.启动被调试程序. 2.让被调试的程序在指定的位置停住. ...

  7. Java学习笔记(三)——运算符

    一.运算符: 1.分类: 2.java中的运算符 (1)其中,++在左,表示先加了再用,++在右,表示先用了再加. (2)% 用来求余数,也称为"取模运算符" 3.赋值运算符 4. ...

  8. LoadRunner 脚本学习 -- 随机函数运用

    直接上码 Action() { int randnum; randnum = rand()%+; lr_output_message("随机得到的数是:%d", randnum); ...

  9. CLR 初步

    1. 源代码编译为托管模块 程序在.NET框架下运行,首先要将源代码编译为 托管模块.CLR是一个可以被多种语言所使用的运行时,它的很多特性可以用于所有面向它的开发语言.微软开发了多种语言的编译器,编 ...

  10. Angular.js 以及个人学习网站

    Angular.js  教程 http://www.360doc.com/content/14/0414/15/14416931_368816305.shtml web前端学习: 慕课网:http:/ ...