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;
}