萌新刚学 SAM,模板题爆蛋求助
查看原帖
萌新刚学 SAM,模板题爆蛋求助
547908
NightTide楼主2022/7/26 15:58

RT,样例过了但是全部 WA,求助大佬帮忙调一下。

#include<bits/stdc++.h>
#define MAXL 1000010
using namespace std;
struct node{
    int len, link;
    map<char, int> nxt;
};
struct edge{
    int pre, to;
};
edge e[MAXL << 1];
node sam[MAXL << 1];
int n, cnt, tot, ans, last;
int head[MAXL << 1], dp[MAXL << 1];
char s[MAXL];
void sam_init(){
    sam[0].len = 0;
    sam[0].link = -1;
    last = 0;
}
void sam_extend(char c){
    int now = ++tot;
    sam[now].len = sam[last].len + 1;
    int p = last;
    while(p != -1 && !sam[p].nxt.count(c)){
        sam[p].nxt[c] = now;
        p = sam[p].link;
    }
    if(p == -1) sam[now].link = 0;
    else{
        int q = sam[p].nxt[c];
        if(sam[p].len + 1 == sam[q].len) sam[now].link = q;
        else{
            int clone = ++tot;
            sam[clone] = (node){sam[p].len + 1, sam[q].link, sam[q].nxt};
            while(p != -1 && sam[p].nxt[c] == q){
                sam[p].nxt[c] = clone;
                p = sam[p].link;
            }
            sam[q].link = sam[now].link = clone;
        }
    }
    last = now;
}
void add_edge(int u, int v){
    e[++cnt].pre = head[u];
    e[cnt].to = v;
    head[u] = cnt;
}
void dfs(int now){
    dp[now] = 1;
    for(int i = head[now]; i; i = e[i].pre){
        dfs(e[i].to);
        dp[now] += dp[e[i].to];
    }
    if(dp[now] != 1) ans = max(ans, dp[now] * sam[now].len);
}
int main(){
    scanf("%s",s + 1); n = strlen(s + 1);
    sam_init();
    for(int i = 1; i <= n; i++) sam_extend(s[i]);
    for(int i = 1; i <= tot; i++) add_edge(sam[i].link, i);
    dfs(0);
    printf("%d\n",ans);
    return 0;
}
2022/7/26 15:58
加载中...