ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 1554-D, *1800
    코드포스 2021. 8. 13. 14:26
     

    Problem - 1554D - Codeforces

     

    codeforces.com

    문제

    • 다음 조건을 만족시키는 길이가 $n(1\leq n \leq 10^{5})$인 문자열$s$을 출력하라
    • $s$의 부분문자열의 개수는 항상 홀수개여야 한다 ~ !
      ex) uuuauu
      ㅇ u -5개
      ㅇ uu - 3개
      ㅇ uuu - 1개
      ㅇ au - 1개 ...

     

    $O(n)$

    Claim
    다음과 같은 형태의 문자열을 생각하자
    $$\begin{aligned}
    \text{uu}&\text{lu}\\
    \text{uuu}&\text{luu}\\
    \text{uuuu}&\text{luuu}\\
    \end{aligned}$$

    이와 같은 규칙을 갖는 문자열은 조건 ! 을 만족한다

    $\because$
    오직 한번만 등장하는 문자를 포함하는(l 을 포함하는) 부분문자열의 개수는 항상 1개만 존재한다
    따라서 u 만으로 이루어진 문자열의 개수만을 세어 조건이 만족되는지 확인한다

    l 을 기준으로 왼쪽과 오른쪽에서 각각 어떤 부분문자열의 수를 셀 때
    한쪽은 짝수, 다른한쪽은 홀수가 나오므로 그 부분문자열의 개수는 항상 홀수이다

    예를 들어, $\text{uuuu}\text{luuu}$ 에서 부분문자열 $\text{uuu}$를 센다고 하면
    l 왼쪽에는 2개, 오른쪽에는 1개가 나오게 되어 총 홀수개의 부분문자열이 존재한다□

     

    Cor
    다음과 같은 문자열도 조건을 만족시킨다
    $$\begin{aligned}
    \text{buu}&\text{lu}\\
    \text{buuu}&\text{luu}\\
    \text{buuuu}&\text{luuu}\\
    \end{aligned}$$

    $\because$
    오직 한번만 등장하는 문자를 포함하는(b 또는 l을 포함하는) 부분문자열의 개수는 항상 1개이고
    u 만으로 이루어진 부분문자열은 항상 홀수개임을 앞서 증명했다□

    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
    #include <bits/stdc++.h>
    #define endl "\n"
    #define loop(i, n) for(int i = 1; i <= n; i++)
    using namespace std;
     
    int n;
     
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0), cout.tie(0);
     
        int t;
        cin >> t;
        while(t--){
            cin >> n;
            if(n==1){
                cout << 'u' << endl;
                continue;
            }
            loop(i, n/2cout << 'u';
            cout << 'a';
            loop(i, n/2-1cout << 'u';
            if(n%2cout << 'b' << endl;
            else cout << endl;
        }
     
        return 0;

    ※ 항상 최대와 최소는 예외가 발생하지 않는지 확인해볼것!

    '코드포스' 카테고리의 다른 글

    1554-A, *800  (0) 2021.08.15
    1554-C, *1800  (0) 2021.08.14
    1513-B, *1400  (0) 2021.08.11
    1547-C, *1100  (0) 2021.08.10
    1526-B, *1400  (0) 2021.08.10

    댓글

Designed by Tistory.