10分WA求助!QaQ
查看原帖
10分WA求助!QaQ
215953
wzch楼主2023/4/19 21:37

蟹蟹大佬orz

#include<bits/stdc++.h>
using namespace std;
struct NODE{int fa,son[26],len,siz;}a[3000015];
int tot=1;
void update(char x,int i)
{
	int p=tot;a[++tot].siz=1;a[tot].len=i+1;
	for(;p&&!a[p].son[x];p=a[p].fa)a[p].son[x]=tot;
	
	if(!p){a[tot].fa=1;return;}

	int q=a[p].son[x];
	if(a[p].len+1==a[q].len){a[tot].fa=q;return;}

	a[++tot].fa=a[q].fa;a[q].fa=tot;a[tot].len=a[p].len+1;for(int i=0;i<26;i++)a[tot].son[i]=a[q].son[i];a[tot-1].fa=tot;
	for(int i=p;a[i].son[x]==q;i=a[i].fa)a[i].son[x]=tot;
	return;
}
struct EDGE{int to,nxt;}edge[3000015];int head[3000015],tt;void Add(int x,int y){edge[++tt].to=y;edge[tt].nxt=head[x];head[x]=tt;return;}
void makeTr(){for(int i=2;i<=tot;i++)Add(a[i].fa,i);return;}
long long Max;
void sol(int x)
{

	for(int i=head[x];i;i=edge[i].nxt)sol(edge[i].to),a[x].siz+=a[edge[i].to].siz;
	if(a[x].siz!=1)Max=max(Max,(long long)a[x].len*a[x].siz);
	return;
}
int main()
{
	string s;getline(cin,s);
	for(int i=0;i<s.length();i++)update(s[i]-'a',i);
	makeTr();sol(1);printf("%lld\n",Max);
	return 0;
}
2023/4/19 21:37
加载中...