제출 #795022

#제출 시각아이디문제언어결과실행 시간메모리
795022vjudge1Copy and Paste 3 (JOI22_copypaste3)C++17
100 / 100
351 ms54068 KiB
#include <bits/stdc++.h> #define fi first #define se second const int N = 2505; const int mod = 1e9 + 7; using namespace std; vector<int> z_function(string s) { vector<int> z(s.size()); for (int i = 1, l = 0, r = 0; i < s.size(); i++) { if (i <= r) { z[i] = min(r - i, z[i - l]); } while (i + z[i] < s.size() && s[z[i]] == s[i + z[i]]) { z[i]++; } if (i + z[i] - 1 > r) { l = i; r = i + z[i] - 1; } } return z; } int n; string s; int z[N][N]; long long A, B, C; long long d[N][N]; long long inf = 1e18; int main() { #ifdef zxc freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #endif ios_base::sync_with_stdio(0); cin >> n >> s >> A >> B >> C; for (int i = n - 1; i >= 0; i--) { for (int j = i; j < n; j++) { z[i][j] = n; d[i][j] = inf; } auto g = z_function(s.substr(i)); for (int j = 1; j < g.size(); j++) { if (g[j] == 0) { continue; } int h = i + min(j, g[j]) - 1; z[i][h] = min(z[i][h], i + j); } for (int j = n - 1; j > i; j--) { z[i][j - 1] = min(z[i][j - 1], z[i][j]); } } cin >> A >> B >> C; for (int i = n - 1; i >= 0; i--) { for (int j = i; j < n; j++) { d[i][j] = min(d[i][j], min(d[i + 1][j], d[i][j - 1]) + A); int x = i, cnt = 0; while (z[x][x + j - i] != n) { cnt += 1; int y = z[x][x + j - i]; d[i][y + j - i] = min(d[i][y + j - i], d[i][j] + B + C * (cnt + 1) + A * (y - j - 1 - (j - i + 1) * (cnt - 1))); x = y; } } } cout << d[0][n - 1] << "\n"; }

컴파일 시 표준 에러 (stderr) 메시지

copypaste3.cpp: In function 'std::vector<int> z_function(std::string)':
copypaste3.cpp:13:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   13 |  for (int i = 1, l = 0, r = 0; i < s.size(); i++) {
      |                                ~~^~~~~~~~~~
copypaste3.cpp:17:25: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   17 |         while (i + z[i] < s.size() && s[z[i]] == s[i + z[i]]) {
      |                ~~~~~~~~~^~~~~~~~~~
copypaste3.cpp: In function 'int main()':
copypaste3.cpp:49:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   49 |         for (int j = 1; j < g.size(); j++) {
      |                         ~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...