不知道为什么就过了
查看原帖
不知道为什么就过了
236447
冬刃楼主2021/5/11 20:41

感觉我的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;
}
2021/5/11 20:41
加载中...