๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋ฐฑ์ค€/Gold

[BOJ] 5582 : ๊ณตํ†ต ๋ถ€๋ถ„ ๋ฌธ์ž์—ด

by Jaeguk 2022. 4. 5.
๋ฌธ์ œ ๋งํฌ

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<intpair<intint>>vector<pair<intpair<intint>>>, greater<pair<intpair<intint>>>> 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

์„ค๋ช… ๋Šฅ๋ ฅ์ด ๋ถ€์กฑํ•ด์„œ ์•„์ด๋””์–ด๋ฅผ ๊ธ€๋กœ ์ ์–ด๋‚ด๋Š”๊ฒŒ ์–ด๋ ต๋‹ค. ์•„๋งˆ ๋‚ด๊ฐ€ ๋‚˜์ค‘์— ์ด ๊ธ€์„ ๋‹ค์‹œ์ฝ์–ด๋„ ์ž˜ ์ดํ•ดํ•˜์ง€ ๋ชปํ•  ๊ฒƒ๊ฐ™๋‹ค. ๊ทธ๋ž˜๋„ ์ฝ”๋“œ๋ฅผ ๋ณธ๋‹ค๋ฉด ๊พธ์—ญ๊พธ์—ญ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

728x90