求帮卡空间
查看原帖
求帮卡空间
1397028
E_M_T楼主2024/12/28 09:43

除了 Subtask 4 MLE 了几个之外都过了。

是这个做法本身就错了还是被卡空间了?

#include<bits/stdc++.h>
#define sd std::
// #define int long long
#define F(i,a,b) for(i=(a);i<=(b);i++)
#define f(i,a,b) for(i=(a);i>=(b);i--)
#define MIN(x,y) (x<y?x:y)
#define MAX(x,y) (x>y?x:y)
#define me(x,y) memset(x,y,sizeof x)
#define pii sd pair<int,int>
#define X first
#define Y second
#define Fr(a) for(auto it:a)
const int N=1.2e6+10;
struct state
{
	int len,link;
	sd map<int,int> nex;
}st[N];
int last,siz;
void init()
{
	st[0].link=-1;
	siz++;
}
bool dp[N][2];//记录两个
int cnt[N];
void extend(char c,int op)
{
	int cur=siz++,p=last;
	dp[cur][op]=1;
	cnt[cur]=1;
	st[cur].len=st[last].len+1;
	while(p!=-1&&!st[p].nex.count(c))
	{
		st[p].nex[c]=cur;
		p=st[p].link;
	}
	if(p==-1) st[cur].link=0;
	else
	{
		int q=st[p].nex[c];
		if(st[q].len==st[p].len+1)
		{
			st[cur].link=q;
		}
		else
		{
			int nw=siz++;
			st[nw].link=st[q].link;
			st[nw].len=st[p].len+1;
			st[nw].nex=st[q].nex;
			while(p!=-1&&st[p].nex[c]==q)
			{
				st[p].nex[c]=nw;
				p=st[p].link;
			}
			st[cur].link=st[q].link=nw;
		}
	}
	last=cur;
}
struct node
{
	int nex;
	int to;
}a[N];
int tot,head[N];
void add(int u,int v)
{
	a[++tot].nex=head[u];
	head[u]=tot;
	a[tot].to=v;
}
void dfs(int u)
{
	for(int i=head[u];i;i=a[i].nex)
	{
		int v=a[i].to;
		dfs(v);
		dp[u][0]|=dp[v][0];
		dp[u][1]|=dp[v][1];
		cnt[u]+=cnt[v];
	}
}
int n,i;
char s[N];
void solve()
{
	scanf("%s",s+1);
	n=strlen(s+1);
	init();
	F(i,1,n) extend(s[i],0);
	extend('{',0);
	f(i,n,1) extend(s[i],1);
	F(i,1,siz-1) add(st[i].link,i);
	dfs(0);
	long long ans=0;
	F(i,0,siz-1) if(dp[i][1]&dp[i][0]) ans=MAX(ans,1ll*cnt[i]/2*st[i].len);
	printf("%lld",ans);
}
signed main()
{
	int T=1;
//	T=read();
	while(T--) solve();
    return 0;
}
2024/12/28 09:43
加载中...