萌新初学 manacher,求调简单模板
查看原帖
萌新初学 manacher,求调简单模板
1254235
Priestess_SLG楼主2025/6/13 15:10
// #pragma GCC optimize(3, "Ofast", "inline", "unroll-loops")
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2000010;
const int mod = 19930726;
const int inf = 1e18;

char s[N], t[N], buc[N];
int p[N];
// p[i]: 以 i 为中心的最长回文半径长度
int power(int a, int b, int c)
{
    int ans = 1;
    while (b)
    {
        if (b & 1)
            ans = ans * a % c;
        a = a * a % c, b >>= 1;
    }
    return ans;
}

signed main()
{
    // cin.tie(0)->sync_with_stdio(false);
    int n, k;
    cin >> n >> k;
    scanf("%s", s + 1);
    for (int i = 1; i <= n; ++i)
        t[i * 2] = s[i], t[i * 2 + 1] = '$';
    t[1] = '$';
    n = n * 2 + 1;
    for (int i = 1; i <= n; ++i)
        s[i] = t[i];
    int pos = 0, r = 0;
    for (int i = 1; i <= n; ++i)
    {
        if (i < r)
            p[i] = min(p[2 * pos - i], r - i);
        else
            p[i] = 1;
        while (i + p[i] <= n && i - p[i] >= 1 && s[i + p[i]] == s[i - p[i]])
            ++p[i];
        if (p[i] + i > r)
            pos = i, r = i + p[i];
        ++buc[p[i] - 1];
    }
    int s = 1;
    for (int i = n; i; --i) if (i & 1)
    {
        k -= buc[i];
        if (k < 0)
        {
            s = s * power(i, k + buc[i], mod) % mod;
            break;
        }
        else
            s = s * power(i, buc[i], mod) % mod;
    }
    if (k > 0)
        s = -1;
    cout << s << '\n';
    return 0;
}

样例过了,hack 也过了,但是 Wa 10pts,求大佬教/kel

2025/6/13 15:10
加载中...