BAEKJOON

BAEKJOON 8913번: 문자열 뽑기

杉山空 2022. 2. 26. 03:12
728x90

https://www.acmicpc.net/problem/8913

 

8913번: 문자열 뽑기

a와 b로만 이루어진 문자열 s이 있다. 그룹은 같은 글자로 이루어진 가장 긴 연속 부분 문자열이다. 길이가 2 이상인 s의 모든 그룹 g는 제거할 수(뽑을 수) 있고, 남은 왼쪽 부분과 오른쪽 부분을

www.acmicpc.net

풀이

문자열의 길이가 최대 25정도로 매우 작기 때문에 모든 경우의 수를 다 확인할 수 있다. 문자열을 bit로 표현하여 뽑아낼 수 있는 부분을 차례대로 뽑아내면서 한번이라도 가능한 경우가 나오면 탐색을 중단하고 1을 출력한다.

 

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <bits/stdc++.h>
using namespace std;
char S[30];
bool f(int bit,int len){
    if(len==0)return true;else if(len==1)return false;
    vector<bool>A(len+1,0);
    vector<int>P(len+1,0);
    P[0]=1;
    for(int i=0;i<len;i++)A[i]=(1<<i)&bit;
    for(int i=1;i<len;i++){
        if(A[i]==A[i-1])P[i]=P[i-1]+1;else P[i]=1;
    }
    bool ret=false;int i=len-1;
    while(i>0){
        int s,e;
        if(P[i]>1){
            s=i-P[i]+1,e=i;
            i-=P[i];
            int tmp=0;
            for(int j=0;j<s;j++)if(A[j])tmp+=1<<j;
            for(int j=e+1;j<len;j++)if(A[j])tmp+=1<<(j-e+s-1);
            if(f(tmp,len-e+s-1))ret=true;
            if(ret)break;
        }else i--;
    }
    return ret;
}
int main(){
    int T,N,bit;
    scanf("%d",&T);
    while(T--){
        scanf("%s",S);
        N=strlen(S);bit=0;
        for(int i=0;i<N;i++){
            if(S[i]=='b')bit+=1<<i;
        }
        printf("%d\n",f(bit,N));
    }
    return 0;
}
 
cs
728x90

'BAEKJOON' 카테고리의 다른 글

BAEKJOON 1701번: Cubeditor  (0) 2022.03.01
BAEKJOON 2252번: 줄세우기  (0) 2022.03.01
BAEKJOON 9002번: Match Maker  (0) 2022.02.23
BAEKJOON 22345번: 누적거리  (0) 2022.02.09
BAEKJOON 2482번: 색상환  (0) 2021.12.21