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】收集卡片相关推荐

  1. JZOJ 100047. 【NOIP2017提高A组模拟7.14】基因变异

    Description 21 世纪是生物学的世纪,以遗传与进化为代表的现代生物理论越来越多的 进入了我们的视野. 如同大家所熟知的,基因是遗传因子,它记录了生命的基本构造和性能. 因此生物进化与基因的 ...

  2. JZOJ 5372. 【NOIP2017提高A组模拟9.17】猫

    Description 信息组最近猫成灾了!隔壁物理组也拿猫没办法.信息组组长只好去请神刀手来帮他们消灭猫.信息组现在共有n 只猫(n 为正整数),编号为1 到n,站成了一个环,第i 只猫的左边是第i ...

  3. 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 ...

  4. JZOJ 5371. 【NOIP2017提高A组模拟9.17】组合数问题

    Description 定义"组合数"S(n,m)代表将n 个不同的元素拆分成m 个非空集合的方案数.举个例子,将{1,2,3}拆分成2 个集合有({1},{2,3}),({2},{1,3}),({3 ...

  5. 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 ...

  6. JZOJ 100030. 【NOIP2017提高A组模拟7.8】为了爱情

    Description Input 输入文件第一行包含一个正整数 k.之后是 k 组测试用例. 每组测试用例的第一行为一个整数 n.接下来 n 行,每行 n 个以空格隔开的数,用来 描述棋盘的初始状态 ...

  7. JZOJ 100026. 【NOIP2017提高A组模拟7.7】图

    Description 有一个n个点n条边的有向图,每条边为< i,f(i),w(i)>,意思是i指向f(i)的边权为w(i)的边,现在小A想知道,对于每个点的si和mi. si:由i出发 ...

  8. 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 ...

  9. JZOJ 5405. 【NOIP2017提高A组模拟10.10】Permutation

    Description 你有一个长度为n 的排列P 与一个正整数K 你可以进行如下操作若干次使得排列的字典序尽量小 对于两个满足|i-j|>=K 且|Pi-Pj| = 1 的下标i 与j,交换P ...

最新文章

  1. 自动生成小学四则运算题目的程序.心得体会
  2. JavaScript(八)
  3. leetcode-34-在排序数组中查找元素的第一个和最后一个位置
  4. WordCount运行详解
  5. 使用C语言中的宏来定位出错信息
  6. Bootstrap系列 -- 37. 基础导航样式
  7. 3.5 《数据库系统概论》之基本表更新(INSERT、UPDATE、ALTER、DELETE)与视图VIEW(定义、查询、更新)
  8. 第九周(11.02-11.08)学习笔记
  9. echarts使用记录(二)legend翻页,事件,数据集,设置y轴最大/小值,让series图形从右侧出往左移动...
  10. js闭包,这个算是比较通俗的了(转)
  11. GNSS数据处理(二)——GAMP_GOOD操作说明
  12. android adb驱动win7,win7 64位adb驱动怎么安装_win7安装abd驱动的方法图文步骤
  13. 使用matlab生成高斯滤波模板_matlab 高斯滤波(原创)
  14. java语法 chm_使用java代码打开chm格式的帮助文档
  15. 推荐一个可以连gmail的邮箱
  16. 广义相对论-学习记录1-第一章-历史回顾
  17. itools android玩游戏,itools安卓模拟器电脑版
  18. matlab半小提琴图,【ggplot2】不同方法画half -小提琴图
  19. UNL系列图——交互图
  20. 弹性伸缩、安全高效!华为云服务器助力企业数字化转型

热门文章

  1. 图像中值处理MATLAB实现
  2. windows 解决 Go下载包失败 设置代理
  3. GPU(CUDA)学习日记(九)------ CUDA存储器模型
  4. gcc选项 和 gdb 使用
  5. 【总结】机器学习划分数据集的几种方法
  6. 撒花!斯坦福深度学习最新视频发布,吴恩达主讲!
  7. [OS复习]设备管理1
  8. ffmpeg本地编译没有ffplay解决方案
  9. cmake的使用-为什么要使用CMake
  10. 2020-10-29