求助 50 pts
查看原帖
求助 50 pts
516725
cosf楼主2023/8/11 18:10

rt,我的代码通过了样例和某人的 hack,但是却 50pts,错误原因:

Too long on line 2.

啊?我输出了第二行?没有啊。

这是我的代码,希望有大佬可以给出解答。

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;

#define MAXN 1000006
#define ALF 26
#define nc(x) (x - 'a')

using ll = long long;

struct SAM
{
    int s[ALF];
    int l, f;
} t[MAXN];
int idx = 1, last = 1;

ll cnt[MAXN];
int v[MAXN];

vector<int> e[MAXN];

ll sum[MAXN];

void add(int c)
{
    int p = last, n = last = ++idx;
    t[n].l = t[p].l + 1;
    cnt[n]++;
    for (; p && !t[p].s[c]; p = t[p].f)
    {
        t[p].s[c] = n;
    }
    if (!p)
    {
        t[n].f = 1;
    }
    else if (t[t[p].s[c]].l == t[p].l + 1)
    {
        t[n].f = t[p].s[c];
    }
    else
    {
        int f = ++idx, r = t[p].s[c];
        t[f] = t[r];
        t[f].l = t[p].l + 1;
        t[n].f = t[r].f = f;
        for (; p && t[p].s[c] == r; p = t[p].f)
        {
            t[p].s[c] = f;
        }
    }
}

void cs(int p)
{
    for (int c : e[p])
    {
        cs(c);
        cnt[p] += cnt[c];
    }
}

void dfs1(int p, ll k)
{
    if (k <= cnt[p])
    {
        return;
    }
    k -= cnt[p];
    for (int c = 0; c < ALF; c++)
    {
        if (t[p].s[c])
        {
            if (k > sum[t[p].s[c]])
            {
                k -= sum[t[p].s[c]];
            }
            else
            {
                putchar(c + 'a');
                dfs1(t[p].s[c], k);
                return;
            }
        }
    }
}

int dfs2(int p)
{
    if (v[p])
    {
        return sum[p];
    }
    v[p] = 1;
    for (int c = 0; c < ALF; c++)
    {
        if (t[p].s[c])
        {
            sum[p] += dfs2(t[p].s[c]);
        }
    }
    return sum[p];
}

char s[MAXN];

int main()
{
    int m;
    ll k;
    scanf("%s%d%lld", s, &m, &k);
    int n = strlen(s);
    for (int i = 0; i < n; i++)
    {
        add(nc(s[i]));
    }
    for (int i = 2; i <= idx; i++)
    {
        e[t[i].f].push_back(i);
    }
    if (!m)
    {
        for (int i = 1; i <= idx; i++)
        {
            cnt[i] = !!cnt[i];
        }
    }
    else
    {
        cs(1);
    }
    cnt[1] = 0;
    for (int i = 1; i <= idx; i++)
    {
        sum[i] = cnt[i];
    }
    dfs2(1);
    if (sum[1] < k)
    {
        cout << -1 << endl;
        return 0;
    }
    dfs1(1, k);
    return 0;
}

2023/8/11 18:10
加载中...