后缀自动机
作者:
wwdxwjl
,
2022-10-04 20:29:41
,
所有人可见
,
阅读 270
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 2e6+5;
struct Node{
int len,fa;
int son[26];
}node[N];
ll f[N];
ll tot = 1,last = 1,ans;
vector<int> g[N];
void dfs(int u){
for(int i = 0; i < g[u].size(); i++){
int j = g[u][i];
dfs(j);
f[u]+=f[j];
}
if(f[u] > 1) ans = max(ans,f[u]*node[u].len);
}
char s[N];
void extend(int c){
int p = last,np = last = ++tot;
f[tot] = 1;
node[np].len = node[p].len+1;
for(; p&&!node[p].son[c]; p = node[p].fa) node[p].son[c] = np;
if(!p) node[np].fa = 1;
else{
int q = node[p].son[c];
if(node[q].len == node[p].len+1) node[np].fa = q;
else{
int nq = ++tot;
node[nq] = node[q],node[nq].len = node[p].len+1;
node[q].fa = node[np].fa = nq;
for(;p&&node[p].son[c] == q;p = node[p].fa) node[p].son[c] = nq;
}
}
}
signed main(){
scanf("%s",s);
for(int i = 0; s[i]; i++) extend(s[i]-'a');
for(int i = 2; i <= tot; i++) g[node[i].fa].push_back(i);
dfs(1);
cout << ans << '\n';
}