很猛的芯求助,爆了十几次蛋了
查看原帖
很猛的芯求助,爆了十几次蛋了
491532
艾德加楼主2022/10/9 11:14
#include<bits/stdc++.h>
using namespace std;
struct nod{
	int fa=0,ch[30],len=0;
	nod(){memset(ch,0,sizeof(ch));len=fa=0;}
}dian[2000004];
int tot=1;
int las=0;
long long zhi[2000004];
void add(int x){
	tot++;
	dian[tot].len=dian[tot-1].len+1;
	zhi[tot]=1;
	int p=tot-1;
	for(;p&&!dian[p].ch[x];p=dian[p].fa) dian[p].ch[x]=tot;
	if(p==0)dian[tot].fa=1;
	else {
		int q=dian[p].ch[x];
		if(dian[q].len==dian[p].len+1) dian[tot].fa=q;
		else{
			int clone=++tot;
			dian[clone]=dian[q];
			dian[clone].len=dian[p].len+1;
			dian[q].fa=dian[clone].fa=clone;
			for(;p&&dian[p].ch[x]==q;p=dian[p].fa) dian[p].ch[x]=clone;
		}
	}	
}
struct node{
	int gg,to;
}a[2000004];
int cnt=0;
int last[2000005];
void adde(int x,int y){
	a[++cnt].to=y;
	a[cnt].gg=last[x];
	last[x]=cnt;
}
long long maxn=0;
void dfs(int x){
	for(int i=last[x];i;i=a[i].gg){
		int y=a[i].to;
		dfs(y);
		zhi[x]+=zhi[y];
	}
	if(zhi[x]!=1) maxn=max(maxn,zhi[x]*dian[x].len);
}
char s[2000004];
int main(){
	scanf("%s",s);
	int op=strlen(s);
	for(int i=0;i<op;i++) add(s[i]-'a');
	for(int i=2;i<=tot;i++) adde(dian[i].fa,i);
	dfs(1);
	cout<<maxn;
}	
2022/10/9 11:14
加载中...