P0689. 宝石串

#include<bits/stdc++.h>
using namespace std;
int b[2000010], ans, k;
//k表示的是当前前缀的差值(也就是红宝石和绿宝石之间个数的差距)
//bi表示的是绿宝石与红宝石之间差值为i时的最前的下标

//因为这个差值可能是负数所以就加一个1000000的偏移量
//如果这个差值在之前出现过就表示从第一次出现的下标到当前这个位置是稳定的
//否则不存在稳定解,并记录一下这个下标为当前差值下的最前坐标
int main(){
	string s; cin >> s;
	for(int i = 0; i < s.size(); i++){
		if(s[i] == 'G') k++;
		if(s[i] == 'R') k--;
		if(b[k+1000000] != 0){
			ans = max(i-b[k+1000000]+1, ans);
		}else b[k+1000000] = i+1;
	}
	cout << ans;
	return 0;
}

#include <bits/stdc++.h>
using namespace std;


int main(){
    string s;
    cin >> s;
    //开个map记录一下出现下标
    map<int,int> mp;
    int cnt = 0, mx = 0;
    //从 0 开始遍历字符串 s
    for(int i = 0; i < s.size(); ++i){
        //如果当前字符为 G ,cnt++
        //否则cnt--
        if(s[i]=='G') cnt++;
        else cnt--;
        //如果当前 cnt 被标记过,或者cnt == 0 
        //那么我们记录一下mx的最大值 max(mx, i-mp[cnt]+1)
        if(mp[cnt] || cnt==0) mx = max(mx, i-mp[cnt]+1);
        //否则记录一下当前 cnt 代表的下标  mp[cnt] = i+1;
        else mp[cnt] = i+1;
    }
    //输出
    cout << mx;
    return 0;
}
posted @ 2024-05-23 18:11  Vijurria  阅读(13)  评论(0编辑  收藏  举报