暑期集训 魔法句子

【题目描述】

小 Y 最近在学习魔法。一个字符串是一个魔法句子的条件是,当且仅当其中 ℎ 和 a的个数相同。小 Y 找到了一本魔法书,希望你能找到其中最长的魔法句子。

输入格式

第一行有一个整数 t ,代表测试数据的数量。 接下来 t行,每行包含一个仅由 ℎ 和 a 组成的字符串。

输出格式

对于每组测试数据,输出一个非负整数,代表最长的魔法句子的长度

#include <bits/stdc++.h>
using namespace std;
int len,t,c;
string n;
int main(){
	ios::sync_with_stdio(0),cin.tie(0);
    cin>>t;
    for(int i=1;i<=t;i++){
    	cin>>n;
    	len=n.size();
		c=len;
		int l[2*len]={};
		int r[2*len]={};
        for(int i=0;i<len;i++){
			if(n[i]=='a'){
				c++;
			}else{
				c--;
			}
			if(l[c]==0&&c!=len){
				l[c]=i+1;
			}else{
				r[c]=i+1;
			}
		}
		int ans=0;
		for(int i=0;i<=len*2;i++){
			ans=max(ans,r[i]-l[i]);
		}
		cout<<ans<<"\n";
    }
    return 0;
}

思路如下

可以引用相对差的概念用x[i]表示到第i个位置处,'a'的个数-'h'的个数的值,那么若x[a]==x[b],则(a,b]区间中'a'的个数等于'h'的个数

于是可以选择记录相对差为num的最左、最右下标位置l[num]和r[num],取r[num]−l[num]的最大值即可,复杂度O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值