中间else部分的图解。
一点理解
这道题是求每个本质不同串的个数,
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 2e6+10;
int tot = 1, last = 1;
struct Node{
int len, fa;
//fa 是绿边
int ch[26];
} node[N];
char str[N];
LL f[N], ans;
int head[N], e[N], ne[N], idx;
void extend(int c){
//以下是1,2,3,4,5,。。。链的部分
int p = last, np = last = ++tot;
f[tot] = 1;
node[np].len = node[p].len+1;
//
for(; p && !node[p].ch[c]; p = node[p].fa) node[p].ch[c] = np;
//通过前面的后缀 指向当前这个点(即连接蓝边)
if(!p) node[np].fa = 1;
else {
int q = node[p].ch[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].ch[c] == q; p = node[p].fa) node[p].ch[c] = nq;
}
}
}
void add(int a, int b){
e[idx] = b, ne[idx] = head[a], head[a] = idx++;
}
void dfs(int u){
for(int i = head[u]; ~i; i = ne[i]){
dfs(e[i]);
f[u] += f[e[i]];
}
if(f[u] > 1) ans = max(ans, f[u]*node[u].len);
}
int main(){
scanf("%s", str);
for(int i = 0; str[i]; i ++ ) extend(str[i] - 'a');
memset(head,-1, sizeof head);
for(int i = 2; i <= tot; i ++ ) add(node[i].fa, i);
dfs(1);
printf("%lld\n", ans);
return 0;
}