10分wa,求助!!!
查看原帖
10分wa,求助!!!
25891
沧桑の天骄楼主2022/8/23 11:27
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#define ll long long
using namespace std;
inline ll max(ll x,ll y){return x>y?x:y;}
inline ll min(ll x,ll y){return x<y?x:y;}
inline int ls(int x){return x<<1;}
inline int rs(int x){return x<<1|1;}
inline ll read(){
	ll x=0,w=1;
	char aa=getchar();
	while(aa<'0'||aa>'9'){
		if(aa=='-'){
			w=-1;
		}
		aa=getchar();
	}
	while(aa>='0'&&aa<='9'){
		x=(x<<3)+(x<<1)+aa-'0';
		aa=getchar();
	}
	return x*w;
}
const int N=1e6+10;

struct tree{
	ll len;
	int fa,ch[31];
	tree(){memset(ch,0,sizeof(ch));len=fa=0;}
}tr[N<<1];
int n,tot=1,la=1;
ll ans,sz[N];
char s[N];
vector<int> e[N<<1];

void insert(int x){
	int p=la,np=la=++tot;sz[tot]=1;
	tr[np].len=tr[p].len+1;
	for(;p&&!tr[p].ch[x];p=tr[p].fa) tr[p].ch[x]=np;
	if(!p) tr[np].fa=1;
	else{
		int q=tr[p].ch[x];
		if(tr[p].len+1==tr[q].len) tr[np].fa=q;
		else{
			int nq=++tot;
			tr[nq]=tr[q];
			tr[nq].len=tr[p].len+1;
			tr[q].fa=tr[np].fa=nq;
			for(;p&&tr[p].ch[x]==q;p=tr[p].fa) tr[p].ch[x]=nq;
		}
	}
}

void dfs(int x){
	for(int i=0;i<e[x].size();i++){
		int y=e[x][i];
		dfs(y);
		sz[x]+=sz[y];
	}
	if(sz[x]!=1) ans=max(ans,sz[x]*tr[x].len);
//	ans+=tr[x].len;
}

int main()
{
	cin>>(s+1);
	n=strlen(s+1);
	for(int i=1;i<=n;i++) insert(s[i]-'a');
	for(int i=2;i<=tot;i++) e[tr[i].fa].push_back(i);
	dfs(1);
	printf("%lld\n",ans);
	return 0;
}

提交记录:https://www.luogu.com.cn/record/84798287

2022/8/23 11:27
加载中...