Submission #1344291

#TimeUsernameProblemLanguageResultExecution timeMemory
1344291gkos5678Palinilap (COI16_palinilap)C++20
17 / 100
1105 ms285328 KiB
#include <bits/stdc++.h>
using namespace std;

#define pb push_back

typedef vector<int> vi;

const int maxn = 5005;

int n, ist[2 * maxn][maxn], l0[2 * maxn][maxn], mx[2 * maxn];
string s;
vi p[30];

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    cin >> s;
    n = s.size();
    for (int i = 0; i < n; i++)
        p[s[i] - 'a'].pb(i);

    for (int i = 0; i < n; i++)
        for (int j = i; j < n; j++)
            ist[i + j][i] = (s[i] == s[j]);
    for (int i = 0; i < 2 * n - 1; i++){
        int l = -1;
        for (int j = 0; j < n; j++){
            if (ist[i][j] == 0) l = j;
            l0[i][j] = l;
        }
    }
    int ans = 0;
    for (int i = 0; i < 2 * n - 1; i++){
        int sr = i / 2;
        mx[i] = sr - l0[i][sr];
        ans += mx[i];
    }

    int mxdod = 0;
    for (int i = 0; i < n; i++){
        for (int j = 0; j < 26; j++){
            if (j == (s[i] - 'a')) continue;
            int dod = 0;
            for (int k : p[j]){
                int sm = i + k;
                int sr = sm / 2;
                int nov = l0[sm][sr];
                if (nov == min(i, k)){
                    if (nov == 0) nov = -1;
                    else nov = l0[sm][nov - 1];
                }
                dod += (sr - nov) - mx[sm];
            }
            for (int k : p[s[i] - 'a']){
                if (k == i) continue;
                int sm = i + k;
                int sr = sm / 2;
                dod -= max(0, min(i, k) - l0[sm][sr]);
            }
            mxdod = max(mxdod, dod);
            if (dod <= 0) continue;
        }
    }

    cout << ans + mxdod << "\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...