玄关,Manacher WA on #9
查看原帖
玄关,Manacher WA on #9
1128559
guoguo160楼主2025/1/21 15:06

思路是反着做一遍 Manacher ,查找最长的回文子串长度,然后再相减。

记录

#include <bits/stdc++.h>

#define int long long 

using namespace std;

const int N = 8 * 1e5 + 10;

string s;
string t;
int p[N];
vector<char> vec;
int n;
int ans = INT_MIN;

signed main() {
    cin >> n;
    cin >> s;
    reverse(s.begin(), s.end());
    t = s;
    vec.push_back('$');
    for (auto k : t) {
        vec.push_back('#');
        vec.push_back(k);
    }
    vec.push_back('#');
    int sz = vec.size();
    for (int i = 1, r = 0, mid = 0;i < sz;++i) {
        if (i <= r) {
            p[i] = max(p[(mid << 1) - i], r - i + 1);
        }
        while (vec[i + p[i]] == vec[i - p[i]])
            p[i]++;
        if (p[i] + i - 1 > r) {
            r = p[i] + i - 1;
            mid = i;
        }
        if (p[i]==i) {
            ans = max(ans, p[i]);
        }
    }
    cout << n-ans+1 << "\n";
    return 0;
}

2025/1/21 15:06
加载中...