プレフィックスやアイデアの宝石の文字列(ロス・バレーP2697)

ジェム文字列

タイトル説明

ルビーやエメラルドでつなぎ合わせ宝石の文字列は、場合にのみ、ルビーやエメラルドの同じ数、破壊しやすいだけで最も安定した宝石の列、があります。アンは与えられた文字列、安定した宝石の文字列の最長可能傍受、宝石合成数から宝石を疑問に思いました。彼を助けてください。

「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;
}
公開された264元の記事 ウォン称賛46 ビュー10000 +

おすすめ

転載: blog.csdn.net/qq_44291254/article/details/105275151