51Nod 1701 最后的机会
1701 最后的机会
给定一字符串S,S非空,由小写字母组成,设v为S中元音字母的个数,c为辅音字母的个数。"a", "e", "i", "o", "u"为元音字母。其余为辅音字母。如果元音字母没有超过辅音字母的2倍,即v≤2c则称S是好的字符串。
现在给定S,找出其中最长的好的子串的长度,以及个数。子串是由原串中连续的几个字符组成的。
样例解释:
在样例一中,最长的子串是他的自身“abo”。其它好的子串是“b”,“ab”,“bo”,但是都不是最长的。
在样例二中,最长的子串是“eis”。其它好的子串是“s”,“is”,但是都不是最长的。
输入
单组测试数据。
共一行字符串S(S非空且长度不大于2*10^5),由小写字母组成。其中"a", "e", "i", "o", "u"为元音字母。其余为辅音字母。
输出
输出两个整数,以空格隔开,分别表示最长的好的子串的长度和以及个数。如果没有好的子串则输出 "No solution" (没有引号)。 两个子串出现的位置不一样则称为是不同的子串。如果同一个子串在不同位置出了多次,则要统计多次。
输入样例
样例一
abo
样例二
oeis
输出样例
输出一
3 1
输出二
3 1
分析
对于符合的任意一段子序列(长度为len),假设其元音字符的个数为sum, 则依题意有sum<=2*(len-sum);
假如求出了元音字符数量的前缀和sum[]. 具体一点,假设这个子序列的左右下标为 i 和 j ,则有:
sum[j]-sum[i-1]<=2*((j-i+1)-(sum[j]-sum[i-1])) , 移项得 3*sum[j]-2*j<=3*sum[i-1]-2*(i-1), 想到可以记录一个
数组存储3*sum[i]-2*i的值。我们要求的最大长度即是满足上式的距离最远的i和j,只需再开一个数组rmin
(右边的最小值),用单调的思想处理一下,枚举i然后二分查找j,更新最大长度。。。
代码如下:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
bool ok(char c)
{
return c=='a'||c=='e'||c=='i'||c=='o'||c=='u';
}
char s[200005];
int ans1,ans2;
int sum[200005];
int T[200005];
int rmin[200005];
int main()
{
//freopen("in.txt","r",stdin);
scanf("%s",s);
int n=strlen(s);
for(int i=1;i<=n;i++)
if(ok(s[i-1]))sum[i]=sum[i-1]+1;
else sum[i]=sum[i-1];
for(int i=1;i<=n;i++)
T[i]=3*sum[i]-2*i;
int tmp=0x3f3f3f3f;
for(int i=n;i>=1;i--)
{
tmp=min(tmp,T[i]);
rmin[i]=tmp;
}
for(int i=1;i<=n;i++)
{
int v=3*sum[i-1]-2*(i-1);
int j=upper_bound(rmin,rmin+1+n,v)-rmin; j--;
if(i<=j){ans1=max(ans1,j-i+1);}
}
for(int i=1,j=i+ans1-1;j<=n;i++,j++)
{
if(3*sum[j]-3*sum[i-1]<=2*(j-i+1))ans2++;
}
if(ans1==0){printf("No solution\n");}
else printf("%d %d\n",ans1,ans2);
return 0;
}
51Nod 1701 最后的机会的更多相关文章
- 51Nod 算法马拉松23 开黑记
惨啊……虽然开了半天黑,但是还是被dalao们踩了…… 第二次开黑,还是被卡在rank20了,我好菜啊……= = 写一写比赛经过吧…… 看到题之后习惯性都打开,A~D看上去似乎并没有什么思路,F应该是 ...
- 51nod 1625 贪心/思维
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1625 1625 夹克爷发红包 基准时间限制:1 秒 空间限制:13107 ...
- HTPC家庭娱乐和XBOX未来发展畅想<另:创业工作机会>
微软中国在上海举办新闻发布会,正式宣布Xbox One将于9月23日在中国开始销售,定价3699元起.这款早在2001年就发布的电视游戏机终于在经历了14年的等待后,进军中国大陆市场.此次Xbox O ...
- 【51Nod 1244】莫比乌斯函数之和
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 模板题... 杜教筛和基于质因子分解的筛法都写了一下模板. 杜教筛 ...
- 51Nod 1268 和为K的组合
51Nod 1268 和为K的组合 1268 和为K的组合 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个正整数组成的数组A,求能否从中选出若干个,使 ...
- 51Nod 1428 活动安排问题
51Nod 1428 活动安排问题 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428 1428 活 ...
- 51Nod 1278 相离的圆
51Nod 1278 相离的圆 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1278 1278 相离的圆 基 ...
- 您还在招聘网上海量投简历然后等面试机会吗?那你已经OUT了。
工作也可以来找我们.不行看完这篇. 从毕业到现在,换了2次工作.每次都在为招工组烦恼.找工作这个问题,不管是应届生还是职场老手.都面临一个问题就是找工作的平台.纵观目前的找工作的形式,主流的不外乎就两 ...
- 风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,
转自:http://www.cnblogs.com/ranranblog/p/5845010.html 风口之下,猪都能飞.当今中国股市牛市,真可谓“错过等七年”. 给你一个回顾历史的机会,已知一支股 ...
随机推荐
- 希尔排序——C语言
希尔排序 希尔排序是插入排序的一种,又称“缩小增量排序”,希尔排序是直接插入排序算法的一种更高效的改进版本,关于插入排序可以看下这篇随笔:插入排序——C语言 (图片来源:https://www.cnb ...
- 阿里云ecs不同网段内网互通
建立ClassicLink连接 官方文档:https://help.aliyun.com/document_detail/65413.html?spm=a2c4g.11186623.2.12.16c9 ...
- HALC:用于长读取错误纠正的高吞吐量算法
背景: 第三代PacBio SMRT长读取可以有效地解决第二代测序技术的读长问题,但包含大约15%的测序错误.已经设计了几种纠错算法以有效地将错误率降低到1%,但是它们丢弃了大量未校正的碱基,因此导致 ...
- HTTP参数污染(参数处理图)
- docker系列之六容器数据卷
docker之容器数据卷 一.容器数据卷 docker容器运行的时候,会产生一系列的文件,那么我们希望容器产生的数据能提供给其他的容器使用,也就是说怎么实现容器间的数据的共享呢?这就需要用到我们所提到 ...
- JS实现异步的几种方式
1.JS执行环境:单线程 单线程:就是指一次只能完成一件任务.若有多个任务时,就必须排队,等前面一个任务完成之后,再执行后面一个任务 缺点:任务耗时很长,后面的任务需要等待,拖延整个程序的执行.例 ...
- 高射炮打蚊子,杀鸡用绝世好剑:在SAP Kyma上运行UI5应用
国人在表述"大材小用"这个场景时,总喜欢用一些实物来类比,比如:高射炮打蚊子. 英国QF 3.7英寸(94mm)高射炮,战斗全重超过9.3吨,全长近5米,最大射程约18公里,最大射 ...
- python 操作Hbase 详解
博文参考:https://www.cnblogs.com/tashanzhishi/p/10917956.html 如果你们学习过Python,可以用Python来对Hbase进行操作. happyb ...
- PAT Basic 1075 链表元素分类 (25 分)
给定一个单链表,请编写程序将链表元素进行分类排列,使得所有负值元素都排在非负值元素的前面,而 [0, K] 区间内的元素都排在大于 K 的元素前面.但每一类内部元素的顺序是不能改变的.例如:给定链表为 ...
- 通用分页model封装pageList
package selfimpr.page; import java.util.List; /** * 分页模型 * @param <T> 数据泛型 * @author selfimpr ...