본문 바로가기
알고리즘/Codeforces

Codeforces Round #666 (Div. 2) AC

by 유시은 2020. 8. 31.
#include <bits/stdc++.h>
using namespace std; int TEST;
 
int n;
string s;
map<char, int> chars;
int cnt[26];
 
int main() {
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> TEST;
 
    while (TEST--) {
        cin >> n;
        for (int i = 0; i < n; ++i) {
            cin >> s;
            for (char c : s) {
                cnt[int(c - 'a')] += 1;
            }
        }
        bool isGood = true;
        for (int i = 0; i < 26; ++i) {
            if (cnt[i] % n != 0) isGood = false;
            cnt[i] = 0;
        }
        cout << (isGood ? "YES" : "NO") << "\n";
    }
 
    return 0;
}

 

A. Juggling Letters

 

각 알파벳이 나타난 횟수를 센다.

모든 문자열이 같아지게 하려면 각 알파벳은 문자열의 개수의 배수 만큼 있어야 한다.

 

 

#include <bits/stdc++.h>
using namespace std;
 
long long n;
long long arr[100001];
 
int main() {
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
 
    cin >> n;
    for (int i = 1; i <= n; ++i) cin >> arr[i];
 
 
    if (n == 1) {
        cout << "1 1" << "\n";
        cout << 1 << "\n";
        cout << "1 1" << "\n";
        cout << 1 << "\n";
        cout << "1 1" << "\n";
        cout << -(arr[1] + 2);
    }
 
    if (n == 2) {
        cout << "1 1" << "\n";
        cout << -arr[1] << "\n";
        cout << "2 2" << "\n";
        cout << 1 << "\n";
        cout << "2 2" << "\n";
        cout << -(arr[2] + 1);
    }
 
    if (n >= 3) {
 
        cout << "1 1" << "\n";
        cout << arr[1] * (n - 1) << "\n"; // n - 1 is always divisible by 1
        arr[1] += arr[1] * (n - 1);
 
        cout << "2 " << n << "\n"; // n - 1 is always divisible by n - 1
        for (int i = 2; i <= n; ++i) {
            cout << arr[i] * (n - 1) << " ";
            arr[i] += arr[i] * (n - 1);
        }
        cout << "\n";
 
        cout << "1 " << n << "\n"; // n is always divisible by n
        for (int i = 1; i <= n; ++i) {
            cout << -arr[i] << " ";
        }
 
    }
 
    return 0;
}

 

C - Multiples of Length

 

수열의 길이가 1일 때, 2일 때, 그 이상일 때로 구분할 수 있다.

 

수열의 길이가 1일 때 :

  1. 1을 더한다. segment의 길이가 1이므로 어떤 수를 더하거나 빼도 된다.
  2. 다시 1을 더한다.
  3. 자기 자신을 뺀다.

수열의 길이가 2일 때:

  1. 수 하나 (A) 를 선택하여 자기 자신을 빼 0으로 만든다.
  2. 남은 수 (B) 를 선택하여 1을 더한다.
  3. B에서 B를 빼면 마저 0이 된다.

그 이상일 때:

  1. 첫 수를 선택하여 Arr[1] * (수열의 길이 - 1) 을 더한다. 
  2. 나머지 [2:n] i번째 수들을  선택하여 Arr[i] * (수열의 길이 - 1) 을 더한다. 이 segment의 길이는 수열의 길이 - 1 이고, 각 더해지는 수는 Arr[i] * (수열의 길이 - 1) 이므로 수열의 길이 - 1 의 배수이다.
  3. 이전 두 단계를 통해 모든 수는 Arr[i] + Arr[i] * (수열의 길이 - 1) 가 되었고, 이는 최초 Arr[i] * (수열의 길이) 와 같으므로 모든 수는 수열의 길이 의 배수이다. 따라서 모두 자기 자신으로 뺄 수 있다.

 

 

댓글