感觉我的solve函数里好像有错误,交了就过了,是我没错还是测试数据水?
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 5e5 + 100;
int n, t, last, sz, head[N << 1], edge_cnt;
long long k;
char str[N];
struct SAM_state {
int len, link, cnt, next[26];
long long size;
SAM_state(): len(0), link(-1), cnt(0), size(0) {
memset(next, -1, sizeof(next));
}
} st[N << 1];
struct Edge {
int to, next;
Edge(): next(-1) {}
} edge[N << 1];
void init() {
st[0].len = 0;
st[0].link = -1;
last = 0;
memset(head, -1, sizeof(head));
}
void sam_extend(char c) {
int cur = ++sz;
st[cur].len = st[last].len + 1;
st[cur].cnt = 1;
int p = last;
while(p != -1 && st[p].next[c - 'a'] == -1) {
st[p].next[c - 'a'] = cur;
p = st[p].link;
}
if(p == -1) {
st[cur].link = 0;
} else {
int q = st[p].next[c - 'a'];
if(st[p].len + 1 == st[q].len) {
st[cur].link = q;
} else {
int clone = ++sz;
st[clone].link = st[q].link;
for(int i = 0; i < 26; i++)
st[clone].next[i] = st[q].next[i];
st[clone].len = st[p].len + 1;
while(p != -1 && st[p].next[c - 'a'] == q) {
st[p].next[c - 'a'] = clone;
p = st[p].link;
}
st[cur].link = clone;
st[q].link = clone;
}
}
last = cur;
}
void add_edge(int from, int to) {
edge_cnt++;
edge[edge_cnt].to = to;
edge[edge_cnt].next = head[from];
head[from] = edge_cnt;
}
int dfs(int node) {
for(int i = head[node]; i != -1; i = edge[i].next)
st[node].cnt += dfs(edge[i].to);
return st[node].cnt;
}
long long update(int node) {
if(st[node].size)
return st[node].size;
for(int i = 0; i < 26; i++)
if(st[node].next[i] != -1)
st[node].size += update(st[node].next[i]) + (long long)st[node].cnt;
return st[node].size;
}
void solve(int node, long long rm) {
if(!rm) {
printf("\n");
return;
}
long long ans = 0;
for(int i = 0; i < 26; i++)
if(st[node].next[i] != -1) {
ans += st[st[node].next[i]].size + (long long)st[node].cnt;
if(ans >= rm) {
printf("%c", i + 'a');
solve(st[node].next[i], rm - ans + st[st[node].next[i]].size);
break;
}
}
}
int main() {
scanf("%s", str + 1);
n = strlen(str + 1);
scanf("%d%lld", &t, &k);
init();
for(int i = 1; i <= n; i++)
sam_extend(str[i]);
if(!t) {
for(int i = 0; i <= sz; i++)
st[i].cnt = 1;
} else {
for(int i = 0; i <= sz; i++)
if(st[i].link != -1)
add_edge(st[i].link, i);
dfs(0);
}
update(0);
if(k > st[0].size)
printf("-1\n");
else
solve(0, k);
return 0;
}