首页 > 其他 > 详细

P3804 【模板】后缀自动机

时间:2019-10-24 21:59:15      阅读:109      评论:0      收藏:0      [点我收藏+]

P3804 【模板】后缀自动机

 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 }

 

P3804 【模板】后缀自动机

原文:https://www.cnblogs.com/wstong/p/11734698.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!