(2020년 9월 6일에 작성한 글입니다.)
Dashboard - Codeforces Round #657 (Div. 2) - Codeforces
codeforces.com
학회 코드포스 스터디 Road to Expert에서 풀었다.
A.
아니 이 문제가 어떻게 A번일 수 있는가..
싶을 정도로 A번 같지 않은 문제였다.
abacaba가 하나만 존재해야 하기 때문에
물음표를 채우고 나서, 전체 문자열에서 abacaba가 하나밖에 없다는 걸 확인해야 하는데
여기서 나는 abacaba가 시작하는 지점을 indx라고 하면
indx + 4부터 시작하는 abacaba가 있는지만을 확인하면 되는 줄 알았다.
근데 아니었어.
abacaba 앞에 abac가 있을수도 있고, 맨 마지막 a에 bacaba가 붙어서 생겼을수도 있고.
여러 경우가 있다.
그래서 끝나고 원빈이가 다른 분들이 제출한 코드 보고 이야기해줬는데
물음표를 적절히 채울 때 마다
문자열을 처음부터 끝까지 돌면서
abacaba가 몇 개인지를 체크하도록 한 사람이 있었고
문자열 자체가 별로 길지 않고 테스트케이스도 적기 때문에 시간초과가 나지 않는다....
그래서 처음부터 다시 짜서 맞았다.
string s;
string aba = "abacaba";
int N;
int chk()
{
int i, j;
int cnt = 0;
bool flag;
for (i = 0; i + 6 < N && cnt <= 1; i++) {
flag = true;
for (j = 0; j < 7; j++) {
if (s[i + j] != aba[j]) {
flag = false;
break;
}
}
if (flag) {
cnt++;
}
}
return cnt;
}
void print()
{
int i;
cout << "Yes" << '\n';
for (i = 0; i < N; i++) {
if (s[i] == '?') {
cout << 'd';
}
else {
cout << s[i];
}
}
cout << '\n';
return;
}
int main()
{
//freopen("input.txt", "r", stdin);
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int T;
int i, j;
cin >> T;
while (T--) {
cin >> N;
cin >> s;
int check = chk();
if (check == 2) {
cout << "No" << '\n';
continue;
}
else if (check == 1) {
print();
continue;
}
//s[i]에 abacaba 없음
bool flag;
for (i = 0; i + 6 < N; i++) { //처음부터 쭉 가는 중
vector<int> indexs;
flag = true;
for (j = 0; j < 7; j++) {
if (s[i + j] == '?') {
s[i + j] = aba[j];
indexs.push_back(i + j);
}
else if (s[i + j] != aba[j]) {
flag = false;
break;
}
}
if (flag) {
if(chk() != 1) {
flag = false;
}
}
if (flag) {
break;
}
else {
for (int indx : indexs) {
s[indx] = '?';
}
}
}
//결과
if (flag) {
print();
}
else {
cout << "No" << '\n';
}
}
return 0;
}
B.
이것도 진짜 어려웠는데
내가 포인트를 잘못 잡았던 게
abs(b - c) <= (r - l)이어야 하는거고...
다 맞는데
나는 a가 항상 l(엘, 범위의 최솟값)일 줄 알았는데
생각해보니까 그렇지 않은 경우가 있을 수도 있었고,
그래서 for(a = l; a <= r; a++)를 돌면서
abs(b - c) <= (r - l) 및 여러 조건을 만족하는 경우가 존재하는지를 확인해줬고
존재하면 break;
이렇게 했다.....ㅎ
int main()
{
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int T;
ll l, r, m;
ll a, b, c, n;
ll diff, sub;
ll i;
cin >> T;
while (T--) {
cin >> l >> r >> m;
diff = r - l;
for (i = l; i <= r; i++) {
a = i;
n = (m + a - 1) / a; //n * a는 m 이상, b < c
sub = abs(n*a - m);
if (sub <= diff) {
a = i;
b = l;
c = b + sub;
break;
}
n--;
sub = abs(n*a - m);
if (sub <= diff) { // b > c
a = i;
b = r;
c = b - sub;
break;
}
}
cout << a << ' ' << b << ' ' << c << '\n';
}
return 0;
}