Submission #1018738

#TimeUsernameProblemLanguageResultExecution timeMemory
1018738UnforgettableplCopy and Paste 3 (JOI22_copypaste3)C++17
100 / 100
1753 ms416036 KiB
#pragma GCC optimize("Ofast","unroll-loops") #include <bits/stdc++.h> using namespace std; #define int long long int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); int n,a,b,c; string s; cin >> n >> s >> a >> b >> c; s.insert(s.begin(),'$'); vector<vector<int>> DP(n+1,vector<int>(n+1)); for(int l=1;l<=n;l++)for(int r=l;r<=n;r++)DP[l][r]=a*(r-l+1ll); // Do the hashing stuff here map<pair<int,char>,int> hasher; vector<vector<int>> occurences = {{}}; int alloc = 0; for(int l=1;l<=n;l++){ int currhash = 0; for(int r=l;r<=n;r++){ if(!hasher.count({currhash,s[r]})){ hasher[{currhash,s[r]}]=++alloc; occurences.emplace_back(); } currhash = hasher[{currhash,s[r]}]; occurences[currhash].emplace_back(r); } } for(int l=n;l;l--){ int currhash = 0; for(int r=l;r<=n;r++){ currhash = hasher[{currhash,s[r]}]; int len = r-l+1; if(l!=r){ DP[l][r] = min(DP[l][r],DP[l+1][r]+a); DP[l][r] = min(DP[l][r],DP[l][r-1]+a); } auto iter = lower_bound(occurences[currhash].begin(),occurences[currhash].end(),r+len); int cnt = 1; while(iter!=occurences[currhash].end()){ int x = *iter; cnt++; DP[l][x] = min(DP[l][x],DP[l][r]+b+a*(x-l+1ll - cnt*(len))+cnt*c); iter = lower_bound(occurences[currhash].begin(),occurences[currhash].end(),x+len); } } } cout << DP[1][n] << '\n'; }
#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...