( 다양한 아이디어를 적용해야 제한시간 내에 풀 수 있는 어려운 문제였습니다. )
std::set<>
을 이용해서 풀었는데 TLE가 났습니다. 참고하시라고 하단에 코드를 첨부합니다.)std::unordered_map<int, int>
에 넣습니다. 위에서도 해시를 사용하겠다고 말씀드렸죠?#include <bits/stdc++.h>
using namespace std;
constexpr int MAX = 1'001;
int T, M, N, answer;
int A[MAX], B[MAX], psumA[2 * MAX], psumB[2 * MAX];
int main() {
cin.tie(0)->sync_with_stdio(0);
cin >> T >> M >> N;
for (int i = 1; i <= M; ++i) {
cin >> A[i];
psumA[i] = psumA[i - 1] + A[i]; // Partial sum of A
}
for (int i = M + 1; i <= 2 * M; ++i) psumA[i] = psumA[i - 1] + A[i - M];
for (int i = 1; i <= N; ++i) {
cin >> B[i];
psumB[i] = psumB[i - 1] + B[i]; // Partial sum of B
}
for (int i = N + 1; i <= 2 * N; ++i) psumB[i] = psumB[i - 1] + B[i - N];
unordered_map<int, int> cntA;
for (int i = 1; i <= M; ++i) {
for (int j = i; j <= (i - 1) + M; ++j) {
cntA[psumA[j] - psumA[j - i]]++;
if (i == M) break; // 길이가 M인 부분부열은 1개밖에 없으므로
}
}
unordered_map<int, int> cntB;
for (int i = 1; i <= N; ++i) {
for (int j = i; j <= (i - 1) + N; ++j) {
cntB[psumB[j] - psumB[j - i]]++;
if (i == N) break; // 길이가 N인 부분수열은 1개밖에 없으므로
}
}
// 1. 각 A, B에서만 T를 만드는 경우 + 2. A + B를 조합하는 경우
answer = cntA[T] + cntB[T];
for (int i = 1; i < T; ++i) answer += (cntA[i] * cntB[T - i]);
cout << answer;
}