仓鼠更有精神

传送门
斗争了一个小时 还是超时

在这里插入图片描述
在这里插入图片描述

先放到这里吧 ,但是还是很不情愿,有没有大佬帮我看看还能不能优化啊

#include<bits/stdc++.h>
using namespace std;
int b[1001100];
int main()
{
	string a;
	int i,j,k,m,n,t;
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>t;
	while(t--)
	{
		cin>>a>>k;
		int cnt=1;
		int l=a.size();
		if(k>=l)
		{
			cout<<l<<endl;
			continue;
		}
		int flag=0;
		for(i=0;i<l;i++)
		{
			if(a[i]=='a'||a[i]=='e'||a[i]=='i'||a[i]=='o'||a[i]=='u')
			b[cnt++]=i+1;
		}
		if(k>=l-(cnt-1))
		{
			cout<<l<<endl;
			continue;
		}
		if(cnt==1)
		{
			cout<<min(l,k)<<endl;
			continue;
		}
		int ans=0,sum=0;
		for(i=1;i<cnt;i++)
		{
			if(b[i]+k>=b[i+1]-1)
			{
				if(i+1>=cnt)
				ans=k+1;
				j=i+1;
				while(b[i]+k+j-i-1>=b[j]-1&&j<cnt)
				{
					
					m=k-(b[j]-b[i]+1-(j-i+1));
					ans=b[j]-b[i]+1;
					if(m>0)
					ans+=m;
					sum=max(sum,ans);
					j++;
					if(j==cnt)
					flag=1;
				}
			}
			else
			ans=k+1;
			sum=max(sum,ans);
			if(flag)
			break;
		}
		cout<<sum<<endl;
	}
	return 0;
}

看了看别人写的

#include<bits/stdc++.h>
using namespace std;
int a[10000010];
int main()
{
	int i,j,k,m,n,t;
	string s;
	cin>>t;
	while(t--)
	{
		cin>>s>>k;
		int l=s.size();
		for(i=0;i<l;i++)
		{
			if(s[i]=='a'||s[i]=='e'||s[i]=='i'||s[i]=='o'||s[i]=='u')
			a[i]=a[i-1];//表示当前位置全部转化为元音需要花费多少
			else
			a[i]=a[i-1]+1;
		}
		if(a[l-1]<=k)
		{
			cout<<l <<endl;//如果到字符串结尾代价仍小于等于k就可以直接暑促字符串长度了
			continue;
		}
		int ans=0;
		for(i=0;i<l;i++)
		{
			n=upper_bound(a,a+l,a[i-1]+k)-a;//upper_bound是返回大于当前要找的这个值的第一个元素的位置 要减去这个数组的起始位置
			ans=max(ans,n-i);
			if(a[l-1]-a[i-1]<=k)//如果当前字符所在的位置可以直接转化到字符串末尾 就没有必要再接着遍历下去了
			break;
		}
		cout<<ans<<endl;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值