9分求调,悬关
查看原帖
9分求调,悬关
408071
TankYu楼主2024/8/8 16:19

rt,AC on 1

#include <map>
#include <stack>
#include <queue>
#include <cmath>
#include <ctime>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define D double
#define LD long double
#define LL long long
#define ULL unsigned long long
#define S string
#define fi first
#define se second
#define mp make_pair
using namespace std;

int slink[2000010];
int maxlen[2000010];
int nxt[2000010][30];
int TOT = -1;
LL siz[2000010];

int nw(int _maxlen, int _minlen, int *_nxt, int _slink)
{
    TOT++;
    maxlen[TOT] = _maxlen;
    for (int i = 0; i < 26; i++)
    {
        if (_nxt == nullptr)
        {
            nxt[TOT][i] = -1;
        }
        else
        {
            nxt[TOT][i] = _nxt[i];
        }
    }
    slink[TOT] = _slink;
    // if (TOT != 1)
    siz[TOT] = 1;
    return TOT;
}

int insert(char c, int u)
{
    int k = c - 'a';
    int v = u;
    int z = nw(maxlen[u] + 1, -1, nullptr, -1);
    while (v != -1 && nxt[v][k] == -1)
    {
        nxt[v][k] = z;
        v = slink[v];
    }
    if (v == -1)
    {
        slink[z] = 0;
        return z;
    }
    int x = nxt[v][k];
    if (maxlen[x] == maxlen[v] + 1)
    {
        slink[z] = x;
        return z;
    }
    int y = nw(maxlen[v] + 1, -1, nxt[x], slink[x]);
    slink[y] = slink[x];
    slink[x] = slink[z] = y;
    int w = v;
    while (w != -1 && nxt[w][k] == x)
    {
        nxt[w][k] = y;
        w = slink[w];
    }
    return z;
}

int c[2000010], a[2000010];

int main()
{
    S s;
    cin >> s;
    int n = s.size();
    s = ' ' + s;
    int lst = nw(0, 0, nullptr, -1);
    // slink[0] = -1;
    // memset(nxt, -1, sizeof nxt);
    for (int i = 1; i <= n; i++)
    {
        lst = insert(s[i], lst);
    }
    LL ans = 0;
    for (int i = 1; i <= TOT; i++)
        c[maxlen[i]]++;
    for (int i = 1; i <= TOT; i++)
        c[i] += c[i - 1];
    for (int i = 1; i <= TOT; i++)
        a[c[maxlen[i]]--] = i;
    for (int i = TOT; i >= 1; i--)
    {
        int p = a[i];
        siz[slink[p]] += siz[p];
        // cout << siz[p];
        if (maxlen[p] > 1)
        {
            ans = max(ans, siz[p] * maxlen[p]);
        }
    }
    cout << ans;
    return 0;
}

2024/8/8 16:19
加载中...