COUNTPALIN 문제 질문이요

  • younghoo88
    younghoo88

    manacher's algorithm을 이용해서 풀이했고, 웬만한 테스트 입력은 다 통과했는데 도무지 어떤 입력에서 문제가 생기는건지 모르겠습니다...ㅜㅜ

    아래는 작성한 코드입니다.

    #include <iostream>
    #include <vector>
    using namespace std;
    
    void manacher(vector<char> &S, vector<int> &D) {
    
        int R = -1;
        int p = -1;
    
        // iterate 0 ~ n-1, fill the palindrome D array
        for (int i = 0; i < S.size(); i++) {
    
            // get the starting point
            if (R >= S[i]) {
                D[i] = min(D[2*p-i], R-i);
            } else {
                D[i] = 0;
            }
    
            while (S[i-D[i]-1] == S[i+D[i]+1]
                   && (i-D[i]-1) >= 0
                   && (i+D[i]+1) <= S.size()-1) {
                D[i] = D[i] + 1;
            }
    
            // update radius R and center p if (i+D[i]) is greater than R
            if (i+D[i] > R) {
                R = i+D[i];
                p = i;
            }
        }
    
        return;
    }
    
    int main() {
    
        int tc;
        cin >> tc;
    
        for (int t = 0; t < tc; t++) {
            int len;
            cin >> len; // input example: 4
    
            string input;
            cin >> input; // input example: abab
    
            vector<char> S;
    
            for (int i = 0, j = 0; i < len*2-1; i++) {
                if (i % 2 == 0) {
                    S.push_back(input[j++]);
                } else {
                    S.push_back('#');
                }
            }
    
            vector<int> D((unsigned int) S.size());
    
            manacher(S, D);
    
            int count = 0;
    
            for (int i = 0; i < D.size(); i++) {
    
                // '#' 인 경우 counting
                if (D[i] > 0 && S[i] == '#') {
                    count += D[i] - D[i]/2;
                }
    
                // 문자인 경우 counting
                if (D[i] > 1 && S[i] != '#') {
    
                    // 예제입력인 'EWHSPSHAAHDAA' 를 예로 들면,
                    // 이 문자열 중 'HSPSH' 의 경우 '#H#S#P#S#H#' 가 되고,
                    // 가운데 P에 해당하는 팰린드롬의 값은 5가 됩니다. 
                    // 반면, 입력이 'HSPSH' 라면 처리하는 문자열은 
                    // 'H#S#P#S#H' 가 되어 가운데 P에 해당하는 팰린드롬의
                    // 값은 4가 됩니다.
                    // 따라서 이 두 가지 경우 모두 2의 값을 갖게 하기 위해
                    // 다음과 같이 조건을 나누어 처리하였습니다.
                    if (D[i] % 2 == 0) {
                        count += D[i] - D[i]/2;
                    } else {
                        count += D[i] - D[i]/2 - 1;
                    }
                }
            }
    
            cout << count << endl;
        }
    
        return 0;
    }
    


    7년 전
0개의 댓글이 있습니다.
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.