ジェム文字列
タイトル説明
ルビーやエメラルドでつなぎ合わせ宝石の文字列は、場合にのみ、ルビーやエメラルドの同じ数、破壊しやすいだけで最も安定した宝石の列、があります。アンは与えられた文字列、安定した宝石の文字列の最長可能傍受、宝石合成数から宝石を疑問に思いました。彼を助けてください。
「G」とエメラルドルビーが「R」で表される表します。
入力形式
G及びRからなる彼のストリング
出力フォーマット
からなる宝石の宝石の最も長い文字列は、安定した数
この基本的な質問は今はいいません追いつかない考え、より無駄にテンプレートの書き込みに書き込みます。
次いで「G」-1 + 1「R」代表の代表としてプレフィックス、各プレフィックスを計算し、最初の発生位置を記録するとすると、このプレフィックス値再び、最初の出現位置を減算します、アップデートは答えます。
プレフィックスは、負のかもしれないことに注意してください。
コード:
#include<bits/stdc++.h>
#define LL long long
#define pa pair<int,int>
#define ls k<<1
#define rs k<<1|1
#define inf 0x3f3f3f3f
using namespace std;
const int N=1000010;
const int M=2000100;
const LL mod=2e9;
int n,sum[N],pos[M];
char s[N];
int main(){
scanf("%s",s+1);
for(int i=1;s[i]!='\0';i++){
n++;
sum[i]=sum[i-1];
if(s[i]=='G') sum[i]++;
else sum[i]--;
}
int ans=0;
for(int i=1;i<=n;i++){
if(sum[i]<0){
int j=pos[sum[i]+N];
if(j) ans=max(i-j,ans);
else pos[sum[i]+N]=i;
}
else if(sum[i]==0) ans=max(ans,i);
else{
int j=pos[sum[i]];
if(j) ans=max(i-j,ans);
else pos[sum[i]]=i;
}
}
cout<<ans<<endl;
return 0;
}