๋ฌธ์ ๋งํฌ
5582๋ฒ: ๊ณตํต ๋ถ๋ถ ๋ฌธ์์ด (acmicpc.net)
5582๋ฒ: ๊ณตํต ๋ถ๋ถ ๋ฌธ์์ด
๋ ๋ฌธ์์ด์ด ์ฃผ์ด์ก์ ๋, ๋ ๋ฌธ์์ด์ ๋ชจ๋ ํฌํจ๋ ๊ฐ์ฅ ๊ธด ๊ณตํต ๋ถ๋ถ ๋ฌธ์์ด์ ์ฐพ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ์ด๋ค ๋ฌธ์์ด s์ ๋ถ๋ถ ๋ฌธ์์ด t๋, s์ t๊ฐ ์ฐ์์ผ๋ก ๋ํ๋๋ ๊ฒ์ ๋งํ๋ค. ์๋ฅผ ๋ค
www.acmicpc.net
๋ ๋ฌธ์์ด์ด ๊ฐ์ง๊ณ ์๋ ๊ณตํต ๋ฌธ์์ด์ ์ต๋ ๊ธธ์ด๋ฅผ ์ถ๋ ฅํ๋ ๋ฌธ์ .
ํ์ด
์ฃผ์ด์ง ๋ฌธ์์ด์ ๊ฐ๊ฐ A, B ๋ผ๊ณ ํ๊ฒ ๋ค. ๋๋ A ๋ฌธ์์ด์ ๋ฌธ์๋ฅผ ๋๋ฉด์ ๊ฐ๊ฐ์ ์์์ ์ผ๋ก B ๋ฌธ์์ด๊ณผ ๋น๊ตํ๋ ๋ฐฉ์์ผ๋ก ํ์ํ๋ค. A[0] ๋ถํฐ A[length - 1] ๊น์ง ๋๋ฉด์ ๊ฐ ๋ฌธ์๋ฅผ ์์์ ์ผ๋ก B์ ๋ฌธ์์ด๊ณผ ๋น๊ตํ๋ค. ๋ชจ๋ A์ ๋ฌธ์๋ง๋ค B๋ฌธ์์ด ์ฒซ ์ธ๋ฑ์ค์ธ 0๋ฒ์งธ๋ถํฐ ๋น๊ต๋ฅผ ๊ณ์ ํด๋๊ฐ๋ฉด ์๊ฐ์ด ๋๋ฌด ์ค๋ ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ alpha_st ๋ผ๋ ๋ฒกํฐ์ ์ํ๋ฒณ ์์ผ๋ก B ๋ฌธ์์ด์์ ํด๋น ์ํ๋ฒณ์ ์ธ๋ฑ์ค๋ค์ ์ ์ฅํด๋์๋ค.
์๋ฅผ ๋ค์ด ๋ฌธ์์ด B๋ฅผ "AACBDE" ๋ผ๊ณ ํ๋ค๋ฉด, alpah_st[0] ์๋ A์ ์ธ๋ฑ์ค์ธ {0, 1} ์ ์ ์ฅํ๊ณ , alpha_st[1] ์๋ B์ ์ธ๋ฑ์ค์ธ {3}์ ์ ์ฅํ๊ณ , alpha_st[2] ์๋ C์ ์ธ๋ฑ์ค์ธ {2}๋ฅผ ์ ์ฅํด๋์๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฌธ์์ด A๋ฅผ "CBD" ๋ผ๊ณ ํ๋ค๋ฉด A[0]~A[2] ๊น์ง ์์์ ์ผ๋ก ๋๊ฒ ๋๋๋ฐ A[0]๊ฐ ์์์ ์ธ ๊ฒฝ์ฐ์๋ A[0]์ ์ํ๋ฒณ์ด C ์ด๊ธฐ ๋๋ฌธ์ alpha_st[2] ์ ๋ค์ด์๋ ์ธ๋ฑ์ค๋ฅผ ์ถ๋ฐ์ ์ผ๋ก ํ์ํ๋ฉด ๋๋ค.
int find_max_length(int st) {
int Max = 0;
for (int i = 0; i < alpha_st[A[st] - 'A'].size(); i++) {
int st_idx = alpha_st[A[st] - 'A'][i];
int Length = 0;
int A_idx = st;
for (int j = st_idx; j < B.length(); j++) {
if (A[A_idx] == B[j]) {
Length++;
A_idx++;
}
else break;
}
Max = max(Length, Max);
}
return Max;
}
๊ทธ๋ ๊ฒ ์ฒ์์ ์ง ์ฝ๋๊ฐ ์ด ์ฝ๋์ด๋ค. ๋งค๊ฐ๋ณ์ st ์๋ฆฌ์๋ 0 ~ A.length() - 1 ์ ๊ฐ์ด ๋ค์ด๊ฐ๋ค.
ํ์ง๋ง ์ด๋ ๊ฒ ํด๋ ์๊ฐ์ด๊ณผ๊ฐ ๋ฌ๋ค.
๊ทธ๋์ ์ถ๊ฐํด์ค์ฝ๋๊ฐ ์๋์ ์ฝ๋์ด๋ค.
if (B[st_idx + Max] != A[A_idx + Max])
continue;
์์ด๋์ด๋ฅผ ์ค๋ช ํ์๋ฉด Max๋ ํ์ฌ ๊ณตํต ๋ฌธ์์ด์ ์ต๋ ๊ธธ์ด์ด๋ค. A_idx ๋ A์ ์์์ ์ธ๋ฑ์ค ์ฆ st ๊ฐ์ด๊ณ
st_idx๋ alpha_st ๋ฒกํฐ์์ ๊ฐ์ ธ์จ B์ ์์์ ์ด๋ค. ๋น๊ตํ๊ธฐ ์ ์ ๊ณตํต์ ์ธ ๋ถ๋ถ์ ๊ธธ์ด๊ฐ Max๋ณด๋ค ํฌ์ง์๋ค๋ ๊ฑธ ๋ฏธ๋ฆฌ ์๋ค๋ฉด ๊ตณ์ด ๋น๊ตํ ํ์๊ฐ ์๋ค. ๊ทธ๋์ B[st_idx + Max] != A[st + Max] ๋ผ๋ฉด ์ด๋ฏธ ๊ณตํต์ ์ธ ๋ฌธ์์ด ๊ธธ์ด๊ฐ Max๋ณด๋ค ์งง๋ค๋ ๋ป์ด๋ฏ๋ก ๊ตณ์ด ๋น๊ต๋ฅผ ํ์ง์๊ณ ์คํตํ๋ค.
์๋ฅผ ๋ค์ด A๋ฌธ์์ด์ด "ABCDEABCDE" B ๋ฌธ์์ด์ด "BACEAABDED" ๋ผ๊ณ ์์๋ก ์ง์ ํ๋ค.
ํ์ฌ A๋ฌธ์์ด์์ 4๋ฒ ์ธ๋ฑ์ค์ธ 'E'๋ฅผ ์์์ ์ผ๋ก B ๋ฌธ์์ด๊ณผ ๋น๊ต๋ฅผ ํ๋ คํ๋ค. alpha_st['E'] ์๋ B์์ E์ ์ธ๋ฑ์ค์ธ {3 , 8} ์ด ๋ค์ด์๋ค. A๋ 4๋ฒ ์ธ๋ฑ์ค๋ฅผ ์์์ผ๋ก B๋ 3๋ฒ ์ธ๋ฑ์ค๋ฅผ ์์์ผ๋ก ๋น๊ต๋ฅผ ํ ๊ฒ์ด๋ค. ๊ทธ๋ฐ๋ฐ ํ์ฌ ์ฐพ์ ์ต๋ ๊ณตํต ๋ฌธ์์ด์ ๊ธธ์ด๊ฐ 4๋ผ๊ณ ๊ฐ์ ํ์. ์ฌ๊ธฐ์ A[์ธ๋ฑ์ค 4 + ํ์ฌ๊น์ง ๋ฐ๊ฒฌ๋ ์ต๋ ๊ธธ์ด 4] = A[8] . B[์ธ๋ฑ์ค 3 + ํ์ฌ๊น์ง ๋ฐ๊ฒฌ๋ ์ต๋ ๊ธธ์ด 4] = B[7]. A[8] ๊ณผ B[7]์ด ๋ค๋ฅด๋ค๋ฉด ์ด๋ฏธ 4๋ณด๋ค ๊ธด ๊ณตํต๋ฌธ์์ด์ ๋ฐ๊ฒฌ์ด ๋ถ๊ฐ๋ฅ ํ ๊ฒ์ด๋ฏ๋ก ์ฌ๊ธฐ์ ๊ตณ์ด๋์ด์ ๋น๊ต ํ์ง์๊ณ ์คํตํ๋ค๋ ์๋ฏธ์ด๋ค.
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
|
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <string.h>
#include <string>
#include <stack>
#include <vector>
#include <math.h>
#include <queue>
#include <climits>
#include <algorithm>
#include <iomanip>
#include <map>
#define mod 1000000007
using namespace std;
typedef long long ll;
typedef priority_queue<pair<int, pair<int, int>>, vector<pair<int, pair<int, int>>>, greater<pair<int, pair<int, int>>>> Priority_queue;
const int INF = INT_MAX;
const int MAX_N = 1000000 + 5;
vector<int> alpha_st[30];
int N;
string A, B;
int ans = 0;
void find_max_length(int st) {
if (st + ans > A.length() - 1)
return;
for (int i = 0; i < alpha_st[A[st] - 'A'].size(); i++) {
int st_idx = alpha_st[A[st] - 'A'][i];
int Length = 0;
int A_idx = st;
if (st_idx + ans > B.length() - 1)
break;
if (B[st_idx + ans] != A[A_idx + ans])
continue;
for (int j = st_idx; j < B.length(); j++) {
if (A[A_idx] == B[j]) {
Length++;
A_idx++;
}
else break;
}
ans = max(ans, Length);
}
}
int main(void) {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> A;
cin >> B;
for (int i = 0; i < B.length(); i++) {
alpha_st[B[i] - 'A'].push_back(i);
}
for (int i = 0; i < A.length(); i++) {
find_max_length(i);
}
cout << ans << "\n";
return 0;
}
|
cs |
์ค๋ช ๋ฅ๋ ฅ์ด ๋ถ์กฑํด์ ์์ด๋์ด๋ฅผ ๊ธ๋ก ์ ์ด๋ด๋๊ฒ ์ด๋ ต๋ค. ์๋ง ๋ด๊ฐ ๋์ค์ ์ด ๊ธ์ ๋ค์์ฝ์ด๋ ์ ์ดํดํ์ง ๋ชปํ ๊ฒ๊ฐ๋ค. ๊ทธ๋๋ ์ฝ๋๋ฅผ ๋ณธ๋ค๋ฉด ๊พธ์ญ๊พธ์ญ ์ดํดํ ์ ์์ ๊ฒ์ด๋ค.
'๋ฐฑ์ค > Gold' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 18866 : ์ ์ ๋ ์ ์์ด์ฌ (0) | 2022.04.08 |
---|---|
[BOJ] 18858 : ํ๋ จ์๋ก ๊ฐ๋ ๋ (0) | 2022.04.06 |
[BOJ] 2533 : ์ฌํ๋ง ์๋น์ค(SNS) (0) | 2022.04.05 |
[BOJ] 1915 : ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ (0) | 2022.04.04 |
[BOJ] 24888 : ๋ ธํธ ์กฐ๊ฐ (0) | 2022.03.31 |