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
3
AaA
Output
2
Input
7
bcAAcbc
Output
3
Input
6
aaBCCe
Output
5

Note

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

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

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

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

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

#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read()
{
ll s=;
bool f=;
char ch=' ';
while(!isdigit(ch))
{
f|=(ch=='-'); ch=getchar();
}
while(isdigit(ch))
{
s=(s<<)+(s<<)+(ch^); ch=getchar();
}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<)
{
putchar('-'); x=-x;
}
if(x<)
{
putchar(x+''); return;
}
write(x/);
putchar((x%)+'');
return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=;
int n;
char S[N];
int Qzh[N][];
int Need[];
inline char Get(char ch)
{
if(islower(ch)) return ch-'a';
else return ch-'A'+;
}
inline bool Judge(int Pos,int R)
{
int i;
for(i=;i<;i++) if(Need[i])
{
if(Qzh[R][i]-Qzh[Pos][i]==) return false;
}
return true;
}
inline int Check(int ql,int qr,int R)
{
int l=ql,r=qr,mid;
while(l<=r)
{
mid=(l+r)>>;
if(Judge(mid,R)) l=mid+;
else r=mid-;
}
return r;
}
int main()
{
int i,j,ans;
ans=n=read();
scanf("%s",S+);
for(i=;i<=n;i++)
{
for(j=;j<;j++) Qzh[i][j]=Qzh[i-][j];
Qzh[i][Get(S[i])]++;
}
for(i=;i<;i++) if(Qzh[n][i]) Need[i]=;
for(i=;i<=n;i++)
{
bool Bo=;
for(j=;j<;j++) if(Need[j]&&(!Qzh[i][j])) {Bo=; break;}
if(!Bo) break;
}
for(;i<=n;i++)
{
int Pos=Check(,i-,i);
ans=min(ans,i-Pos);
}
Wl(ans);
return ;
}
/*
input
3
AaA
output
2
*/

codeforces701C的更多相关文章

随机推荐

  1. java 桥接模式

    桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦. 1)适配器:改变已有的两个接口,让他们相容. 2)桥接模式:分离抽象化 ...

  2. AI 最小二乘法

    最小二乘法 参考链接: https://zhuanlan.zhihu.com/p/27204466

  3. MySQL 基础一 安装

    1.下载安装包 2.安装MySQL 3.安装操作工具SQLyog 一 下载安装包 地址:百度软件中心MySQL安装包 下载安装操作工具安装包:SQLyog 安装教程地址:http://blog.csd ...

  4. cc攻击和ddos攻击的区别和攻防 + 调SYN连接参数

    1.一个是WEB网络层拒绝服务攻击(DDoS),一个是WEB应用层拒绝服务攻击(CC),网络层就是利用肉鸡的流量去攻击目标网站的服务器,针对比较本源的东西去攻击,服务器瘫痪了,那么运行在服务器上的网站 ...

  5. Image Restoration[Deep Image Prior]

    0.背景 这篇论文是2017年11月29号第一次提交到arxiv并紧接着30号就提交了V2版本的. 近些年DCNN模型在图像生成和修复上面表现很好,大部分人认为好的原因主要是由于网络基于大量的图片训练 ...

  6. c#中的多线程异常 (转载)

    1.对于Thread操作的异常处理 public static void Main() { try { Thread th = new Thread(DoWork); th.Start(); } ca ...

  7. pycharm2019注册码一键实时获取,永久有效!

    pycharm2019专业版激活码 56ZS5PQ1RF-eyJsaWNlbnNlSWQiOiI1NlpTNVBRMVJGIiwibGljZW5zZWVOYW1lIjoi5q2j54mI5o6I5p2 ...

  8. Kafka基础系列第1讲:Kafka的诞生背景及应用

    Kafka 是由 LinkedIn 开发的一个分布式的消息系统,使用 Scala 编写,它以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理系统如 Cloudera.Apache Sto ...

  9. 收藏pdf 链接

    python 入门: https://files.cnblogs.com/files/minsons/python%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E6%B7% ...

  10. Linux下环境变量配置方法梳理(.bash_profile和.bashrc的区别)

    在linux系统下,如果下载并安装了应用程序,在启动时很有可能在键入它的名称时出现"command not found"的提示内容.如果每次都到安装目标文件夹内,找到可执行文件来进 ...