博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JZOJ 100046. 收集卡片
阅读量:6257 次
发布时间:2019-06-22

本文共 1141 字,大约阅读时间需要 3 分钟。

题意:

给出一串只有大小写字母的字符串(长度<=500000),最少连续多少个字符可以使得其中的所有种类的字符都出现在这些选出来的字符中

解题思路:

解法1:

二分

其实这个二分就和维护一个向右移动的窗口差不多
但是会更快
时间复杂度 = 判断O(n) * 二分O(log n) = O(n log n)

解法2:

暴力O(n)扫一遍过

维护head和tail指针暴力扫,找最短
具体见

Accepted code:

//二分解法 理解难度:2星#include
#include
#include
int N, a[150], num;char c[500005];int main() {
scanf("%d", &N); for(int i = 1; i <= N; i++) {
char C = getchar(); while (!((C >= 'A' && C <= 'Z') || ( C >= 'a' && C <= 'z'))) C = getchar(); if (++a[(int)(c[i] = C)] == 1) num++; //共有num种字符 } int l = 1, r = N; while (l < r) {
int mid = (l+r) >> 1, k = 0; memset(a, 0, sizeof a); for (int i = 1; i <= mid && k < num; i++) if(++a[(int)c[i]] == 1) k++; if (k == num) {
r=mid; continue; } for (int i = mid+1; i <= N && k < num; i++) {
if (++a[(int)c[i]] == 1) k++; if (!(--a[(int)c[i-mid]])) k--; } if (k == num) r = mid; else l = mid + 1; } printf("%d", l);}

转载于:https://www.cnblogs.com/Juruo-HJQ/p/10285799.html

你可能感兴趣的文章
unity3d常见问题
查看>>
压缩UIImage
查看>>
hdu1509
查看>>
Eclipse+PyDev 安装和配置
查看>>
使用SQLServer Audit来监控触发器的启用、禁用情况(转载)
查看>>
OFBIZ Party Relationship 关系图
查看>>
获取Cookie(未测试)
查看>>
SQL Server 2008的备份和日志收缩
查看>>
注意linux bash缓存
查看>>
Html 常用事件列表
查看>>
UITextView 实现placeholder的方法
查看>>
Maven入门实战笔记-11节[1-5]
查看>>
python的多重继承
查看>>
索引 - 索引排序顺序
查看>>
MoSQL:简化MongoDB与PostgreSQL之间的同步[转]
查看>>
source insight中文显示和处理
查看>>
spring3.1, hibernate4.1 配置备份,struts2.2.1,sitemesh 2.4.2
查看>>
python字符串格式化输出的方式
查看>>
buffer busy waits等待事件
查看>>
MySQL版本之分:Community Server、Embedded Server、Enterprise Server
查看>>