manacher,样例过了,求调
查看原帖
manacher,样例过了,求调
807181
PoorGhost楼主2024/4/30 21:00
#include <bits/stdc++.h>
using namespace std;
#define TLE (double)clock() / CLOCKS_PER_SEC <= 0.95
#define int long long
#define double long double
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
const int N = 1e7 + 5, M = 5e3 + 5, inf = 0x3f3f3f3f3f3f3f3f, mod = 19930726;
int n;
char a[N / 2], b[N];
int v[N / 2];
int p[N];
bool st[N / 2];
void init()
{
    int k = 0;
    b[k++] = '$', b[k++] = '#';
    for (int i = 0; i < n; i++)
    {
        b[k++] = a[i];
        b[k++] = '#';
    }
    b[k++] = '^';
    n = k;
}
void manacher()
{
    int mr = 0, mid;
    for (int i = 1; i < n; i++)
    {
        if (i < mr)
            p[i] = min(p[mid * 2 - i], mr - i);
        else
            p[i] = 1;
        while (b[i - p[i]] == b[i + p[i]])
            p[i]++;
        if (i + p[i] > mr)
        {
            mr = i + p[i];
            mid = i;
        }
    }
}
void solve()
{
    memset(st, false, sizeof st);
    cin >> a;
    n = strlen(a);
    int nn = n;
    init();
    manacher();
    // cout << "n = " << n << endl;
    for (int i = 1; i < n - 1; i++)
    {
        if (i % 2 == 0)
        {
            v[i / 2 - 1] = p[i] - 1;
        }
    }
    for (int i = nn - 1; i >= 1; i--)
    {
        if (i + (v[i] - 1) / 2 == nn - 1)
        { // 可以直接反转
            st[i] = true;
        }
        else if (st[i + (v[i] - 1) / 2] == true && i == (v[i] - 1) / 2)
        {
            st[i] = true;
        }
    }
    for (int i = 0; i < nn; i++)
    {
        if (st[i] == true)
        {
            cout << (i + 1) << " ";
        }
    }
    cout << endl;
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0); // cin.tie(nullptr);
    int T = 1;
    cin >> T;
    for (int i = 1; i <= T; i++)
    {
        solve();
    }
    return 0;
}
2024/4/30 21:00
加载中...