fhq treap 全wa求调玄关
查看原帖
fhq treap 全wa求调玄关
1129046
lkrkerry楼主2024/7/16 17:14
#include <bits/stdc++.h>
using namespace std;
using ui = unsigned int;

const ui N = 2e5 + 5;
const ui b = 114;
mt19937 rd(114514);
ui bpow[N];
namespace FHQTreap
{
    ui hs[N];
    ui sz[N];
    ui ls[N], rs[N], val[N];
    ui pri[N];
    ui rt = 0, cnt = 0;
    inline void update(ui x)
    {
        sz[x] = sz[ls[x]] + sz[rs[x]] + 1;
        hs[x] = hs[ls[x]] * bpow[sz[rs[x]] + 1] + val[x] * bpow[sz[rs[x]]] + hs[rs[x]];
    }
    inline ui addn(int v = 0)
    {
        val[++cnt] = v;
        pri[cnt] = rd();
        hs[cnt] = v;
        return cnt;
    }
    inline ui merge(ui x, ui y)
    {
        if (!x || !y)
            return x | y;
        if (pri[x] < pri[y])
        {
            rs[x] = merge(rs[x], y);
            update(x);
            return x;
        }
        else
        {
            ls[y] = merge(x, ls[y]);
            update(y);
            return y;
        }
    }
    inline void split(ui u, ui k, ui &x, ui &y)
    {
        if (!u)
            return x = y = 0, void();
        if (sz[ls[u]] < k)
        {
            x = u;
            split(rs[u], k - sz[ls[u]] - 1, rs[u], y);
            update(x);
        }
        else
        {
            y = u;
            split(ls[u], k, x, ls[u]);
            update(y);
        }
        update(u);
    }
    inline void insert(ui pos, ui va)
    {
        ui x, y;
        split(rt, pos, x, y);
        rt = merge(merge(x, addn(va)), y);
    }
    inline void replace(ui pos, ui va)
    {
        ui x, y, z;
        split(rt, pos, x, z);
        split(x, pos - 1, x, y);
        hs[y] = val[y] = va;
        rt = merge(merge(x, y), z);
    }
    inline ui geths(ui l, ui r)
    {
        ui x, y, z;
        split(rt, r, x, z);
        split(x, l - 1, x, y);
        ui ans = hs[y];
        rt = merge(merge(x, y), z);
        return ans;
    }
}

inline ui solve(ui l, ui r, ui len)
{
    if (l > r)
        swap(l, r);
    ui L = 1, R = len - r + 1;
    while (L <= R)
    {
        ui m = (L + R) >> 1;
        if (FHQTreap::geths(l, l + m - 1) == FHQTreap::geths(r, r + m - 1))
            L = m + 1;
        else
            R = m - 1;
    }
    return L - 1;
}

signed main()
{
    // freopen(".in","r",stdin);
    // freopen(".out","w",stdout);
    cin.tie(0)->sync_with_stdio(0);
    bpow[0] = 1;
    for (ui i = 1; i < N; i++)
        bpow[i] = bpow[i - 1] * b;
    string s;
    cin >> s;
    ui len = s.size();
    for (ui i = 0; i < len; i++)
        FHQTreap::insert(i, s[i] - 'a' + 1);
    ui m;
    cin >> m;
    while (m--)
    {
        char op, x;
        ui l, r;
        cin >> op;
        if (op == 'Q')
        {
            cin >> l >> r;
            cout << solve(l, r, len) << '\n';
        }
        else if (op == 'R')
        {
            cin >> l >> x;
            FHQTreap::replace(l, x - 'a' + 1);
        }
        else
        {
            cin >> l >> x;
            len++;
            FHQTreap::insert(l, x - 'a' + 1);
        }
    }
    return 0;
}

/*
  _ _       _
 | | |___ _| |_____ _ _ _ _ _  _
 | | / / '_| / / -_) '_| '_| || |
 |_|_\_\_| |_\_\___|_| |_|  \_, |
                            |__/


madamimadam
19
Q 1 7
Q 4 8
Q 10 11
R 3 a
Q 1 7
R 3 b
Q 2 11
I 4 a
Q 4 7
I 4 b
Q 4 11
I 4 a
Q 4 7
R 4 b
Q 4 11
I 4 a
Q 4 7
R 3 b
Q 2 11


*/
2024/7/16 17:14
加载中...