传送门
斗争了一个小时 还是超时
先放到这里吧 ,但是还是很不情愿,有没有大佬帮我看看还能不能优化啊
#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;
}
}