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