codeforces701C
They Are Everywhere
大B,年轻的口袋妖怪训练师,找到了一个由 n 间从左向右的房间组成的大房子。你可以从街道里走入任何一间房子,也可以从任何一间房子走到街道上。同时,你也可以从左边的一个房间走向右边的房间。房间 1 只和房间2相连 2 并且房间 n 只和房间 n - 1.相连。
在每个房间中恰好有一只某个种类的口袋妖怪,用一个大写或小写字母表示。现在大B要走入其中一间房间,向右走一些房间并捕捉所有路过的房间的口袋妖怪,之后再在某个房间出来。问大B至少要走多少个房间才能捕捉到所有种类的口袋妖怪?
Input
第一行包含一个整数 n (1 ≤ n ≤ 100 000) — 表示房间中口袋妖怪的数量。
第二行包含一个字符串 s 长度为 n,只包含大小写字母,第 i 个字符表示在第 i 个房间中的口袋妖怪种类。
Output
输出最少走过的房间数。
Example
3
AaA
2
7
bcAAcbc
3
6
aaBCCe
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的更多相关文章
随机推荐
- PAT A1136 A Delayed Palindrome (20 分)——回文,大整数
Consider a positive integer N written in standard notation with k+1 digits ai as ak⋯a1a0 ...
- PAT A1153 Decode Registration Card of PAT (25 分)——多种情况排序
A registration card number of PAT consists of 4 parts: the 1st letter represents the test level, nam ...
- 使用自定义端口连接SQL Server的方法(转载)
使用过SQL Server的人大多都知道,SQL Server服务器默认监听的端口号是1433,但是我今天遇到的问题是我的机器上有三个数据库实例,这样使用TCP/IP远程连接时就产生了问题.如何在Mi ...
- Luogu1514 NOIP2010 引水入城 BFS、贪心
传送门 NOIP的题目都难以写精简题意 考虑最上面一排的某一个点对最下面一排的影响是什么样的,不难发现必须要是一段连续区间才能够符合题意. 如果不是一段连续区间,意味着中间某一段没有被覆盖的部分比周围 ...
- React-组件 & Props
React元素可以只是DOM标签 const element = <div />; React元素也可以是用户自定义的组件: const element = <Welcome nam ...
- item 6: 当auto推导出一个不想要的类型时,使用显式类型初始化的语法
本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 Item 5解释了比起显式指定类型,使用auto来 ...
- Webpack 2 视频教程 004 - Webpack 初体验
原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...
- GlusterFS分布式存储系统中更换故障Brick的操作记录
前面已经介绍了GlusterFS分布式存储集群环境部署记录,现在模拟下更换故障Brick的操作: 1)GlusterFS集群系统一共有4个节点,集群信息如下: 分别在各个节点上配置hosts.同步好系 ...
- 快速排序 O(nlogn)
#include<bits/stdc++.h> using namespace std; int a[200],n; void q_sort(int l,int r){ if(l>r ...
- 《Linux内核分析》第八周学习笔记
<Linux内核分析>第八周学习笔记 进程的切换和系统的一般执行过程 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163 ...