반응형
https://www.acmicpc.net/problem/2401
2401번: 최대 문자열 붙여넣기
어떤 긴 문자열이 주어지고 여러 개의 짧은 문자열들이 주어질때 이때 짧은 문자열을 긴 문자열에 붙여 넣을때 가장 길게 붙여 넣는 경우를 찾아라. 단 이때 짧은 문자열들끼리는 교차 할 수 없
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
#define LEN_MAX 100003
string shortStr[501];
int lps[501][10001];
int mem[501];
int dp[LEN_MAX];
int main(){
ios::sync_with_stdio(0); cin.tie(0);
string longStr;
int n, Len;
cin >> longStr >> n;
Len = longStr.length();
//BFS 좌표 저장
for(int N=0; N<n; N++){
cin >> shortStr[N];
int sLen = shortStr[N].length();
for(int i=1, j=0; i<sLen; i++){
while(j>0 && shortStr[N][i]!=shortStr[N][j]){
j = lps[N][j-1];
}
if(shortStr[N][i]==shortStr[N][j]){
lps[N][i] = ++j;
}
}
}
for(int i=0; i<Len; i++){
if(i>0) dp[i] = dp[i-1];
for(int j=0; j<n; j++){
int sLen = shortStr[j].length();
while(mem[j]>0 && longStr[i]!=shortStr[j][mem[j]]){
mem[j] = lps[j][mem[j] - 1];
}
if(longStr[i]==shortStr[j][mem[j]]){
if(mem[j] == sLen - 1){
//dp[-1] 방 지
int tmp = i -sLen >= 0 ? dp[i-sLen] : 0;
tmp += sLen;
dp[i] = max(dp[i], tmp);
mem[j] = lps[j][mem[j]];
}
else{
mem[j]++;
}
}
}
}
cout << dp[Len-1] << '\n';
return 0;
}
반응형
'Algorithm > problem' 카테고리의 다른 글
백준 16563번 : 어려운 소인수분해 - 에라토스테네스의 체 C++ (0) | 2022.06.29 |
---|---|
백준 2470번 : 두 용액 - 투포인터 (0) | 2022.06.29 |
[백준] 4354번 : 문자열 제곱 - 자세한 설명 포함 KMP 알고리즘 응용 (0) | 2022.06.25 |
백준 1786번 : 찾기 - KMP 알고리즘 (0) | 2022.06.24 |
백준 2512번: 예산 - binary search cpp (0) | 2022.06.22 |