They Are Everywhere

CodeForces - 701C

大B,年轻的口袋妖怪训练师,找到了一个由 n 间从左向右的房间组成的大房子。你可以从街道里走入任何一间房子,也可以从任何一间房子走到街道上。同时,你也可以从左边的一个房间走向右边的房间。房间 1 只和房间2相连 2 并且房间 n 只和房间 n - 1.相连。

在每个房间中恰好有一只某个种类的口袋妖怪,用一个大写或小写字母表示。现在大B要走入其中一间房间,向右走一些房间并捕捉所有路过的房间的口袋妖怪,之后再在某个房间出来。问大B至少要走多少个房间才能捕捉到所有种类的口袋妖怪?

Input

第一行包含一个整数 n (1 ≤ n ≤ 100 000) — 表示房间中口袋妖怪的数量。

第二行包含一个字符串 s 长度为 n,只包含大小写字母,第 i 个字符表示在第 i 个房间中的口袋妖怪种类。

Output

输出最少走过的房间数。

Example

Input
  1. 3
    AaA
Output
  1. 2
Input
  1. 7
    bcAAcbc
Output
  1. 3
Input
  1. 6
    aaBCCe
Output
  1. 5

Note

第一个样例中从 1 走到 2。

第二个样例中从 4 走到 6.

第三个样例中从 2 走到 6.

sol:枚举右端点,对于一个右端点R,显然如果L满足区间[L,R]可以覆盖全部,[L-1,R]一定也可以,这样就可以二分了

复杂度玄学O(n*logn*52)一看就是CF能过的复杂度qaq

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef int ll;
  4. inline ll read()
  5. {
  6. ll s=;
  7. bool f=;
  8. char ch=' ';
  9. while(!isdigit(ch))
  10. {
  11. f|=(ch=='-'); ch=getchar();
  12. }
  13. while(isdigit(ch))
  14. {
  15. s=(s<<)+(s<<)+(ch^); ch=getchar();
  16. }
  17. return (f)?(-s):(s);
  18. }
  19. #define R(x) x=read()
  20. inline void write(ll x)
  21. {
  22. if(x<)
  23. {
  24. putchar('-'); x=-x;
  25. }
  26. if(x<)
  27. {
  28. putchar(x+''); return;
  29. }
  30. write(x/);
  31. putchar((x%)+'');
  32. return;
  33. }
  34. #define W(x) write(x),putchar(' ')
  35. #define Wl(x) write(x),putchar('\n')
  36. const int N=;
  37. int n;
  38. char S[N];
  39. int Qzh[N][];
  40. int Need[];
  41. inline char Get(char ch)
  42. {
  43. if(islower(ch)) return ch-'a';
  44. else return ch-'A'+;
  45. }
  46. inline bool Judge(int Pos,int R)
  47. {
  48. int i;
  49. for(i=;i<;i++) if(Need[i])
  50. {
  51. if(Qzh[R][i]-Qzh[Pos][i]==) return false;
  52. }
  53. return true;
  54. }
  55. inline int Check(int ql,int qr,int R)
  56. {
  57. int l=ql,r=qr,mid;
  58. while(l<=r)
  59. {
  60. mid=(l+r)>>;
  61. if(Judge(mid,R)) l=mid+;
  62. else r=mid-;
  63. }
  64. return r;
  65. }
  66. int main()
  67. {
  68. int i,j,ans;
  69. ans=n=read();
  70. scanf("%s",S+);
  71. for(i=;i<=n;i++)
  72. {
  73. for(j=;j<;j++) Qzh[i][j]=Qzh[i-][j];
  74. Qzh[i][Get(S[i])]++;
  75. }
  76. for(i=;i<;i++) if(Qzh[n][i]) Need[i]=;
  77. for(i=;i<=n;i++)
  78. {
  79. bool Bo=;
  80. for(j=;j<;j++) if(Need[j]&&(!Qzh[i][j])) {Bo=; break;}
  81. if(!Bo) break;
  82. }
  83. for(;i<=n;i++)
  84. {
  85. int Pos=Check(,i-,i);
  86. ans=min(ans,i-Pos);
  87. }
  88. Wl(ans);
  89. return ;
  90. }
  91. /*
  92. input
  93. 3
  94. AaA
  95. output
  96. 2
  97. */

codeforces701C的更多相关文章

随机推荐

  1. 完整卸载 kUbuntu-desktop from Ubuntu 14.04 LTS系统 ubuntu14.04 LTS 64Bit

    sudo apt-get remove libkde3support4 k3b-data ntrack-module-libnl-0 libkrosscore4 libgpgme++2 libqapt ...

  2. 一个可爱 & 小清新的加载等待Android控件

    https://github.com/Carson-Ho/Kawaii_LoadingView

  3. 在VS2017上使用C#调用非托管C++生成的DLL文件(图文讲解)

    原文:在VS2010上使用C#调用非托管C++生成的DLL文件(图文讲解) 背景 在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使用一些第三方通讯组件的时候,通过C#来开发应用软件时,就 ...

  4. Bluedroid 函数分析:bta_dm_gattc_register

    我们先来看看在bluedroid 里面有多少地方调用到这里: 可以看出除了 它自己声明的地方,有三处 调用到这个函数. 一处是 进行discovery,一处是进行search的时候,还有一次是bta_ ...

  5. Centos7下关于系统用户密码规则-运维笔记

    针对Centos7下的系统用户的密码规则复杂度的设置,处于安全考虑,说明如下: 一.设置密码规则 1)密码长度.有效期 /etc/login.defs文件是当创建用户时的一些规划,比如创建用户时,是否 ...

  6. linux-shell-引用-命令替换-命令退出状态-逻辑操作符

    命令替换:bash7步扩展的之一 嵌套  这里没什么意义 退出状态可以参与逻辑判断 表达式 算数表达式和条件表达式,逻辑表达式 查看passwd命令比,避免用户捕获输入密码的接口 这种方式就可以直接输 ...

  7. Notes of Daily Scrum Meeting(12.25)

    今天在学姐的帮助下,我们终于把网络连接的部分连通了,这对我们是一个很大的鼓舞,也找到了前期 连不通的问题在哪里,这让我们重新有了进行下去的勇气和决心,我们会在最后这几天把前端和后端结合, 做出我们最后 ...

  8. BugPhobia休息篇章:Beta阶段第IX次Scrum Meeting前奏

    特别说明:此次Scrum Meeting不计入正式的Scrum Meeting,因此此次工作仅为第IX次Scrum Meeting的前奏,而笔者也首次采用休息篇章作为子命题   0x01 :Scrum ...

  9. Linux内核及分析 第四周 扒开系统调用的三层皮(上)

    实验过程 选择20号系统调用getpid(取得进程识别码) 在网上查询getpid函数的C语言代码以及其嵌入式汇编语句 C语言代码: #include <stdio.h> #include ...

  10. 【MOOC EXP】Linux内核分析实验六报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 进程的描述和进程的创建 知识点梳理: ...