1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 2e6+5; 4 typedef long long ll; 5 char s[maxn]; 6 int a[maxn], c[maxn], size[maxn], n; 7 ll ans = 0; 8 struct SuffixAutoMaton { 9 int last, cnt; 10 int ch[maxn*2][26], fa[maxn*2], len[maxn*2]; 11 void ins(int c) { 12 int p = last, np = ++cnt; 13 last = np; len[np] = len[p]+1; 14 for (;p && !ch[p][c]; p = fa[p]) ch[p][c] = np; 15 if (!p) fa[np] = 1; 16 else { 17 int q = ch[p][c]; 18 if (len[p]+1 == len[q]) fa[np] = q; 19 else { 20 int nq = ++cnt; 21 len[nq] = len[p]+1; 22 memcpy(ch[nq],ch[q],sizeof(ch[q])); 23 fa[nq] = fa[q]; fa[q] = fa[np] = nq; 24 for (; ch[p][c] == q; p = fa[p]) ch[p][c] = nq; 25 } 26 } 27 size[np] = 1; 28 } 29 void build() { 30 scanf("%s",s+1); 31 int lens = strlen(s+1); 32 last = cnt = 1; 33 for (int i = 1; i <= lens; i++) ins(s[i]-'a'); 34 } 35 void solve() { 36 for (int i = 1; i <= cnt; i++) c[len[i]]++; 37 for (int i = 1; i <= cnt; i++) c[i] += c[i-1]; 38 for (int i = 1; i <= cnt; i++) a[c[len[i]]--] = i; 39 for (int i = cnt; i; i--) { 40 int p = a[i]; 41 size[fa[p]] += size[p]; 42 if (size[p] > 1) ans = max(ans, 1LL*size[p]*len[p]); 43 } 44 printf("%lld\n",ans); 45 } 46 }sam; 47 int main() { 48 sam.build(); 49 sam.solve(); 50 return 0; 51 }