求助 manacher TLE74pts(不知道是不是做法哪里假了)
查看原帖
求助 manacher TLE74pts(不知道是不是做法哪里假了)
1026365
yb_10032楼主2025/8/1 22:58
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
const int N = 5e5 + 10;
int n;
string s;
int p[N << 1];
ll ans;
inline bool check(char a, char b)
{
    if (a == '#')
        return b == '#';
    if (!isdigit(a) || !isdigit(b))
        return 0;
    return (a - '0') ^ (b - '0');
}
inline void manacher()
{
    string tmp = "$#";
    for (int i = 0; i < s.size(); i++)
        tmp += s[i], tmp += '#';
    tmp += '^';
    int mid = 0, max_r = 0;
    for (int i = 1; i < tmp.size() - 1; i++)
    {
        if (i <= max_r)
            p[i] = min({p[2 * mid - i], max_r - i + 1, i - mid});
        else
            p[i] = 1;
        while (check(tmp[i + p[i]], tmp[i - p[i]]))
            p[i]++;
        if (i + p[i] - 1 > max_r)
            max_r = i + p[i] - 1, mid = i;
        if (tmp[i] == '#')
            ans += (p[i] - 1) / 2;
    }
}
int main(int argc, char const *argv[])
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    cin >> n >> s;
    manacher();
    cout << ans << endl;
    return 0;
}
2025/8/1 22:58
加载中...