萌新90分求助
查看原帖
萌新90分求助
684254
Rain_chr楼主2024/2/28 21:34

目前90分,wa在luogu #6 #19 目前不知道是哪里的问题,有可能是SA写挂了

#include<bits/stdc++.h>
#define int long long
using namespace std; 
const int N=1e6+10;
int sa[N],x[N],y[N],c[N],rk[N],ht[N];
int a[N],Max[N],Max_[N],Min[N],Min_[N],siz[N],fa[N];
int find(int x)
{
	if(fa[x]==x) return fa[x];
	return fa[x]=find(fa[x]);
}
vector<int> lcp[N];
int ans1[N],ans2[N];
int f(int x)
{
	return x*(x-1)/2;
}
signed main()
{
//	freopen("1.in","r",stdin);
//	freopen("1.out","w",stdout); 
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	int n,m=128;
	cin>>n;
	string s;
	cin>>s;
	s=' '+s;
	for(int i=1;i<=n;i++) c[x[i]=s[i]]++;
	for(int i=1;i<=m;i++) c[i]+=c[i-1];
	for(int i=1;i<=n;i++) sa[c[x[i]]--]=i;
	for(int i=1;(1<<i)<=n;i++)
	{
		int now=0;
		for(int j=n-(1<<i-1)+1;j<=n;j++) y[++now]=j;
		for(int j=1;j<=n;j++) if(sa[j]>(1<<i-1)) y[++now]=sa[j]-(1<<i-1);
		for(int j=1;j<=m;j++) c[j]=0;
		for(int j=1;j<=n;j++) c[x[j]]++;
		for(int j=1;j<=m;j++) c[j]+=c[j-1];
		for(int j=n;j;j--) sa[c[x[y[j]]]--]=y[j],y[j]=x[j];
		now=0;
		for(int j=1;j<=n;j++)
			if(y[sa[j]]==y[sa[j-1]]&&y[sa[j]+(1<<i-1)]==y[sa[j-1]+(1<<i-1)]) x[sa[j]]=now;
			else x[sa[j]]=++now;
		m=now; 
		if(n==m) break; 
	}
	for(int i=1;i<=n;i++) rk[sa[i]]=i;
	int p=0;
	for(int i=1;i<=n;i++)
	{
		p=max(0ll,p-1);
		while(sa[rk[i]]+p<=n&&sa[rk[i]-1]+p<=n&&s[sa[rk[i]]+p]==s[sa[rk[i]-1]+p]) p++;
		ht[rk[i]]=p;
		if(rk[i]>1) lcp[p].push_back(rk[i]);
	}
	for(int i=1;i<=n;i++) cin>>a[i]; 
	for(int i=1;i<=n;i++) fa[i]=i,Min[i]=Max[i]=a[i],Max_[i]=-1e18,Min_[i]=1e18,siz[i]=1;
	memset(ans2,0xc0,sizeof(ans2));
	for(int i=n-1;i>=0;i--)
	{
		ans1[i]=ans1[i+1],ans2[i]=ans2[i+1];
		for(int j:lcp[i])
		{
			int x=find(sa[j]),y=find(sa[j-1]);
			fa[x]=y;
			ans1[i]-=f(siz[x])+f(siz[y]);
			siz[y]+=siz[x];
			if(Max[x]>Max[y]) Max_[y]=max(Max_[x],Max[y]),Max[y]=Max[x];
			else Max_[y]=max(Max[x],Max_[y]);
			if(Min[x]<Min[y]) Min_[y]=min(Min_[x],Min[y]),Min[y]=Min[x];
			else Min_[y]=min(Min[x],Min_[y]);
			ans1[i]+=f(siz[y]);
			ans2[i]=max(ans2[i],Max[y]*Max_[y]);
			ans2[i]=max(ans2[i],Min[y]*Min_[y]);
		}
	}
	for(int i=0;i<n;i++) 
		if(ans1[i])
			cout<<ans1[i]<<' '<<ans2[i]<<endl;
		else
			cout<<0<<' '<<0<<endl;
	return 0;	
} 
2024/2/28 21:34
加载中...