제출 #565103

#제출 시각아이디문제언어결과실행 시간메모리
565103clarenceCopy and Paste 3 (JOI22_copypaste3)C++17
100 / 100
281 ms34016 KiB
#include <cstdio> #include <algorithm> #include <vector> using namespace std; typedef long long ll; int N; char S[2510]; ll dp[2510][2510]; ll A, B, C; int groups = 0; int nextGroups = 0; int counter[30]; vector<int> same[1500]; vector<int> same2[1500]; vector<int> temp[30]; int pow2[30]; int nextAnchor[2500]; int main(void) { for (int i=0;i<26;i++) { pow2[(1<<i)%29] = i; } scanf("%d %s%lld%lld%lld", &N, S, &A, &B, &C); for (int i=1;i<=N;i++) { for (int j=0;j+i<=N;j++) { dp[j][j+i] = A*i; } } for (int i=1;i<=N;i++) { // length for (int j=0;j+i<=N;j++) { dp[j][j+i] = min(dp[j][j+i], min(dp[j+1][j+i], dp[j][j+i-1])+A); } if (i<=N/2) { if (i == 1) { for (int j=0;j+i<=N;j++) { temp[S[j]-'a'].push_back(j); } for (int k=0;k<26;k++) { if ((int)temp[k].size()>=2) { same[groups++] = temp[k]; } temp[k].clear(); } } else { // hash stuff?? nextGroups = 0; int bm = 0; for (int k=0;k<groups;k++) { for (int j=0;j<(int)same[k].size();j++) { if (same[k][j]+i > N) continue; bm = bm | (1 << (int)(S[same[k][j]+i-1]-'a')); temp[S[same[k][j]+i-1]-'a'].push_back(same[k][j]); } // bitmask yay while (bm) { int lsb = bm & (-bm); if (temp[pow2[lsb%29]].size() >= 2) { same2[nextGroups++] = temp[pow2[lsb%29]]; } temp[pow2[lsb%29]].clear(); bm -= lsb; } } for (int k=0;k<nextGroups;k++) { same[k] = same2[k]; } groups = nextGroups; } for (int k=0;k<groups;k++) { int ptr = 0; int L = (int)same[k].size(); for (int j=0;j<L;j++) { // try making from here // same[k] should be sorted while (ptr < L && same[k][j]+i>same[k][ptr]) ptr++; nextAnchor[j] = ptr; } ll dpValue = dp[same[k][0]][same[k][0]+i]; for (int j=0;j<L;j++) { // try making from here // same[k] should be sorted int cur = nextAnchor[j]; int cnt = 2; int start = same[k][j]; while (cur < L) { int stop = same[k][cur]+i; dp[start][stop] = min( dp[start][stop], cnt * C + B + dpValue + A * (stop - start - cnt * i) ); cur = nextAnchor[cur]; cnt++; } } } } } /*for (int i=0;i<=N;i++) { for (int j=i;j<=N;j++) { printf("%lld ", dp[i][j]); } printf("\n"); }*/ printf("%lld\n", dp[0][N]); return 0; }

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

copypaste3.cpp: In function 'int main()':
copypaste3.cpp:22:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   22 |     scanf("%d %s%lld%lld%lld", &N, S, &A, &B, &C);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...