JZOJ 100046. 【NOIP2017提高A组模拟7.14】收集卡片
Description
Star 计划订购一本将要发行的周刊杂志,但他可不是为了读书,而是—— 集卡。 已知杂志将要发行 N 周(也就是 N 期),每期都会附赠一张卡片。Star 通 过种种途径,了解到 N 期杂志附赠的卡片种类。Star 只想订购连续的若干期, 并在这些期内收集所有可能出现的种类的卡片。现在他想知道,他最少需要订 购多少期。
Input
第一行一个整数 N;
第二行一个长度为 N 的字符串,由大写或小写字母组成,第 i 个字符表示 第 i 期附赠的卡片种类,每种字符(区分大小写)表示一种卡片。
Output
输出一行一个整数,表示 Star 最少订购的期数。
Sample Input
8
acbbbcca
Sample Output
3
Data Constraint
对于 30%的数据,N ≤ 300;
对于 40%的数据,N ≤ 2000;
对于 60%的数据,N ≤ 5000;
对于 80%的数据,N ≤ 100000;
对于 100%的数据,N ≤ 500000。
Solution
这题的题意就是给你一段包含多种元素序列,求最短的一段连续的区间包含所有种类的元素。
那么就有各种解决的方法了,我的方法是 O(NlogN)O(NlogN) 的。(听说 O(N)O(N) 扫一遍就可以了)
先二分答案 Mid ,把原问题转化成判定性问题。
在将长为 Mid 的区间一格一格地从左向右移动,一边加进一个新元素,一边删去。
中途用一个标志数组 Bz[i]Bz[i] 表示 ii 这个字母在区间中出现的多少次,
并维护包含的元素种类是否达到全部即可,这样的复杂度是 O(N)O(N) 。
再结合上二分,总时间复杂度就是 O(NlogN)O(NlogN) ,秒过本题。
Code
#include<cstdio>
#include<cstring>
using namespace std;
int n,num;
int a[500001],bz[150];
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){char ch=getchar();while(!('A'<=ch && ch<='Z' || 'a'<=ch && ch<='z')) ch=getchar();if(++bz[a[i]=ch]==1) num++;}int l=1,r=n;while(l<r){int mid=(l+r)>>1,k=0;memset(bz,0,sizeof(bz));for(int i=1;i<=mid && k<num;i++)if(++bz[a[i]]==1) k++;if(k==num){r=mid;continue;}for(int i=mid+1;i<=n && k<num;i++){if(++bz[a[i]]==1) k++;if(!--bz[a[i-mid]]) k--;}if(k==num) r=mid; else l=mid+1;}printf("%d",l);return 0;
}
JZOJ 100046. 【NOIP2017提高A组模拟7.14】收集卡片相关推荐
- JZOJ 100047. 【NOIP2017提高A组模拟7.14】基因变异
Description 21 世纪是生物学的世纪,以遗传与进化为代表的现代生物理论越来越多的 进入了我们的视野. 如同大家所熟知的,基因是遗传因子,它记录了生命的基本构造和性能. 因此生物进化与基因的 ...
- JZOJ 5372. 【NOIP2017提高A组模拟9.17】猫
Description 信息组最近猫成灾了!隔壁物理组也拿猫没办法.信息组组长只好去请神刀手来帮他们消灭猫.信息组现在共有n 只猫(n 为正整数),编号为1 到n,站成了一个环,第i 只猫的左边是第i ...
- JZOJ 5392. 【NOIP2017提高A组模拟10.5】Lucky Transformation
Description Input Output Sample Input 7 2 2343223 4 1 2234 Sample Output 2243233 2334 Data Constrain ...
- JZOJ 5371. 【NOIP2017提高A组模拟9.17】组合数问题
Description 定义"组合数"S(n,m)代表将n 个不同的元素拆分成m 个非空集合的方案数.举个例子,将{1,2,3}拆分成2 个集合有({1},{2,3}),({2},{1,3}),({3 ...
- JZOJ 100041. 【NOIP2017提高A组模拟7.12】列车调度
Description Input Output Sample Input Sample1: 3 1 2 3 Sample2: 9 1 3 2 4 8 6 9 5 7 Sample Output Sa ...
- JZOJ 100030. 【NOIP2017提高A组模拟7.8】为了爱情
Description Input 输入文件第一行包含一个正整数 k.之后是 k 组测试用例. 每组测试用例的第一行为一个整数 n.接下来 n 行,每行 n 个以空格隔开的数,用来 描述棋盘的初始状态 ...
- JZOJ 100026. 【NOIP2017提高A组模拟7.7】图
Description 有一个n个点n条边的有向图,每条边为< i,f(i),w(i)>,意思是i指向f(i)的边权为w(i)的边,现在小A想知道,对于每个点的si和mi. si:由i出发 ...
- JZOJ 5402. 【NOIP2017提高A组模拟10.8】God Knows
Description Input Output Sample Input 5 3 1 4 5 2 3 4 3 4 1 Sample Output 5 Data Constraint Solution ...
- JZOJ 5405. 【NOIP2017提高A组模拟10.10】Permutation
Description 你有一个长度为n 的排列P 与一个正整数K 你可以进行如下操作若干次使得排列的字典序尽量小 对于两个满足|i-j|>=K 且|Pi-Pj| = 1 的下标i 与j,交换P ...
最新文章
- 自动生成小学四则运算题目的程序.心得体会
- JavaScript(八)
- leetcode-34-在排序数组中查找元素的第一个和最后一个位置
- WordCount运行详解
- 使用C语言中的宏来定位出错信息
- Bootstrap系列 -- 37. 基础导航样式
- 3.5 《数据库系统概论》之基本表更新(INSERT、UPDATE、ALTER、DELETE)与视图VIEW(定义、查询、更新)
- 第九周(11.02-11.08)学习笔记
- echarts使用记录(二)legend翻页,事件,数据集,设置y轴最大/小值,让series图形从右侧出往左移动...
- js闭包,这个算是比较通俗的了(转)
- GNSS数据处理(二)——GAMP_GOOD操作说明
- android adb驱动win7,win7 64位adb驱动怎么安装_win7安装abd驱动的方法图文步骤
- 使用matlab生成高斯滤波模板_matlab 高斯滤波(原创)
- java语法 chm_使用java代码打开chm格式的帮助文档
- 推荐一个可以连gmail的邮箱
- 广义相对论-学习记录1-第一章-历史回顾
- itools android玩游戏,itools安卓模拟器电脑版
- matlab半小提琴图,【ggplot2】不同方法画half -小提琴图
- UNL系列图——交互图
- 弹性伸缩、安全高效!华为云服务器助力企业数字化转型