
Codeforces Round #747 (Div. 2)-C. Make Them Equal
falconlee236
·2021. 11. 13. 17:47
문제 설명
지우에게 문자
우리가 사용해야할 연산은 다음과 같다.
- 지우는
을 만족하는 숫자 를 선택하고, 로 나누어 떨어지지 않는 모든 에 대해서 를 로 바꾼다.
우리는 한 문자열에 있는 모든 문자를
Input
첫번째 줄에는 테스트 케이스의 수
각 테스트 케이스의 첫번째 줄에는 정수
각 테스트 케이스의 두번째 줄에는 모든 문자가 알파벳 소문자로만 이루어져 있는 문자열
Output
각 테스트케이스마다 먼저 모든 문자를
그리고 다음 줄에 우리가 선택해야 하는
만약 답이 여러개 있으면 아무거나 출력한다.
Example
input
3
4 a
aaaa
4 a
baaa
4 b
bzyx
output
0
1
2
2
2 3
문제 접근
사용한 알고리즘: 수학, 그리디 알고리즘, 완전탐색, 문자열
걸린 시간 : 00:11
진짜 조금만 더 하면 풀 수 있었는데 C번 문제의 벽에 막혔다. 진짜 아쉬웠던 문제. 이 문제의 핵심 부분은 잡아냈는데, 구현이 안된다 구현이.
이 문제에 핵심 포인트는 이 문제에 나올 수 있는 답은 3가지 뿐이라는 사실이다.
- 문자열을 이루고 있는 모든 문자가
로 이루어져 있다면 연산할 필요가 없기 때문에 답은 0이다. - 특정한 index를 선택하고 이 수와 그 수의 배수로 이루어져 있는 수에 대응되는 문자가 모두
라면 이 index만 선택하면 나머지 문자가 로 변하기 때문에 답은 1이다. - 위의 모든 경우가 아니라면 그냥 맨 뒤 문자와 맨 뒤에서 한칸 앞에 있는 문자를 선택하면 무조건 모든 문자를 다 바꿀 수 있기 때문에 답은 2이다.
여기서 우리가 구해야 하는 것은 2번 경우이다. 왜냐하면 1번 경우는 너무나 자명하고, 3번 경우는 보편적인 답이지만 최소 값이 아니기 때문이다.
이제 2번 경우를 어떻게 구해야하는지 생각해보자. 그런데 이것도 간단하다.
먼저 이것을 알아야 한다. 총 수가
따라서 문제에서 주어지는
1번 index부터 그 index의 모든 배수를 구한다. 그 배수에 대응되는 문자 값이
정답 코드
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int t; cin >> t;
while(t--){
int n;
char c, s[3000010];
cin >> n >> c >> s + 1;
int idx = -1;
for(int i = 1; i <= n; i++){
idx = i;
for(int j = i; j <= n; j += i){
if(s[j] != c){
idx = 0;
break;
}
}
if(idx) break;
}
if(idx == 1) cout << 0;
else if(idx > 1) cout << 1 << "\n" << idx;
else cout << 2 << "\n" << n << " " << n - 1;
cout << "\n";
}
return 0;
}
'알고리즘 > codeforces' 카테고리의 다른 글
Educational Codeforces Round 115 (Rated for Div. 2)-A. Computer Game (0) | 2021.11.15 |
---|---|
Codeforces Round #747 (Div. 2)-E1. Rubik's Cube Coloring (easy version) (0) | 2021.11.13 |
Codeforces Round #747 (Div. 2)-B. Special Numbers (0) | 2021.11.13 |
Codeforces Round #747 (Div. 2)-A. Consecutive Sum Riddle (0) | 2021.11.11 |
Codeforces Round #746 (Div. 2)-B. Hemose Shopping (0) | 2021.11.10 |