교육 Codeforces 라운드 55 (사업부 정격. 2) B. VOVA 및 트로피 (+ 욕심 문자열)

B. VOVA 및 트로피
TEST2 초마다의 시간 제한
test256 메가 바이트 당 메모리 제한
입력 inputstandard
outputstandard 출력
VOVA 다른 대회 N 트로피를 받았다. 각 트로피 황금 또는은 중 하나입니다. 트로피가 일렬로 배열된다.

배열의 아름다움은 황금 트로피로 구성된 긴 서브 세그먼트의 길이입니다. 가장 긴 같은 서브 세그먼트의 길이를 최대화하기 위해, 의미 - VOVA는 가능한 한 배열이 아름다운하기 위해 두 개의 트로피 (반드시 인접)를 교환하고자합니다.

VOVA를 도와주세요! 그는 최대 한 스왑을 수행 할 수있는 경우 그에게 배열의 가능한 최대의 아름다움을 알려주십시오.

입력
트로피 수 - 첫 번째 행은 하나의 정수 n (2≤n≤105)을 포함한다.

두 번째 행은 그렇지 실버 트로피있어, i 번째 문자가 G 인 후 제 i 트로피 황금 한 경우 그들 각각의 G 또는 S. 어느 하나이고, n은 문자를 포함한다.

출력
VOVA는 최대 한 스왑을 수행 할 수있는 경우, 황금 트로피의 서브 세그먼트의 최대 가능 길이를 인쇄 할 수 있습니다.


inputCopy
10
GGGSGGGSGG
outputCopy
7
inputCopy
4
GGGG
outputCopy
4
inputCopy
3
SSS
outputCopy
0

, VOVA는 지표 (4) 및 (10) 따라서, 그 시퀀스 "GGGGGGGSGS"를 얻와 트로피를 교환하는 첫 번째 예에서는 황금의 긴 서브 세그먼트의 길이를 트로피는 7이다.

두 번째 예에서는 VOVA는 전혀 스왑을 만들 수 있습니다. 순서 황금 트로피의 가장 긴 서브 세그먼트의 길이는 4입니다.

세 번째 예에서 VOVA 시퀀스 0보다 큰 황금 트로피의 긴 서브 세그먼트의 길이를 만들기 위해 아무것도 할 수 없습니다.

질문의 의미 : 아이디어 : 표준 프로세스 것은 아주 좋은 쓰고, 그것을하는 것이 좋습니다.




자세한 내용은 코드를 참조하십시오 :

#include <bits/stdc++.h>

using namespace std;

int n;
string s;

int main() {
    
    cin >> n >> s;
    
    vector <int> l(n), r(n);
    for(int i = 0; i < n; ++i){
        if(s[i] == 'G'){
            l[i] = 1;
            if(i > 0) l[i] += l[i - 1];
        }
    }
    for(int i = n - 1; i >= 0; --i){
        if(s[i] == 'G'){
            r[i] = 1;
            if(i + 1 < n) r[i] += r[i + 1];
        }
    }
    
    
    int res = 0;
    int cntG = 0;
    for(int i = 0; i < n; ++i)
            cntG += s[i] == 'G';
            
    for(int i = 0; i < n; ++i){
        if(s[i] == 'G') continue;
        int nres = 1;
        if(i > 0) nres += l[i - 1];
        if(i + 1 < n) nres += r[i + 1];
        res = max(res, nres);
    }
    
    res = min(res, cntG);
    if(cntG == n) res = cntG;
    cout << res << endl;
    return 0;
}

추천

출처www.cnblogs.com/qieqiemin/p/11184653.html