玄学求条
查看原帖
玄学求条
788951
TLE_AK楼主2024/7/25 09:09
#include<bits/stdc++.h>
using namespace std;
#define int long long

namespace acac
{
	char S[400010],T[400010];
	int SA[400010],rk[400010],He[400010],tmp[400010],C[400010],st[400010][30];
	int n,na,nb,nm;;
	
	bool cmp(int a,int b)
	{
		return S[a]<S[b];
	}
	
	void build(int n)
	{
		for(int i=1;i<=n;i++)
		{
			SA[i]=i;
		}
		sort(SA+1,SA+1+n,cmp);
		for(int i=n;i;i--)
		{
			if(i<n&&S[SA[i]]==S[SA[i+1]])rk[SA[i]]=rk[SA[i+1]];
			else rk[SA[i]]=i;	
		}
		for(int d=2;;d<<=1)
		{
			int w=0;
			for(int i=1;i<=d/2;i++)
			{
				tmp[++w]=n-i+1;
			}
			for(int i=1;i<=n;i++)
			{
				if(SA[i]>d/2)tmp[++w]=SA[i]-d/2;
			}
			for(int i=0;i<=n+1;i++)
			{
				C[i]=i+1;
			}
			for(int i=n;i;i--)
			{
				SA[--C[rk[tmp[i]]]]=tmp[i];
			}
			int tf=1;
			for(int i=n;i;i--)
			{
				if(i!=n&&rk[SA[i]]==rk[SA[i+1]]&&(SA[i]+d/2<=n?rk[SA[i]+d/2]:-1)==(SA[i+1]+d/2<=n?rk[SA[i+1]+d/2]:-1)) 
				{
					tmp[SA[i]]=tmp[SA[i+1]];
					tf=0;
				}
				else tmp[SA[i]]=i;
			}
			for(int i=1;i<=n;i++)
			{
				rk[i]=tmp[i];
			}
			if(tf)break;
		}
		int ans=0;
		for(int i=1;i<=n;i++)
		{
			if(ans)ans--;
			if(rk[i]>1)
			{
				while(SA[rk[i]-1]+ans<=n&&i+ans<=n&&S[SA[rk[i]-1]+ans]==S[i+ans])
				{
					ans++;
				}
			}
			He[rk[i]]=ans;
		}
		for(int i=1;i<=n;i++)
		{
			st[i][0]=He[i];
		//	cout<<rk[i]<<'\n';
		}
		for(int j=1;j<=20;j++)
		{
			for(int i=1;i+(1<<j)-1<=n;i++)
			{
				st[i][j]=min(st[i][j-1],st[i+(1<<(j-1))][j-1]);
			}
		}
	}
	
	
	struct edge
	{
		int to,ne;
	}e[7000010];
	int H[7000010],ds[7000010],D[7000010];
	long long dp[7000010],val[7000010];
	int cnt;
	int tot;
	
	void add(int a,int b)
	{
	//	cout<<a<<' '<<b<<endl;
		e[++cnt].to=b;
		e[cnt].ne=H[a];
		H[a]=cnt;
		ds[b]++;
	}
	
	long long topo()
	{
		int l=1,r=0;
		for(int i=1;i<=tot;i++)
		{
			if(!ds[i])D[++r]=i;
			dp[i]=val[i];
		}
		long long ans=0; 
		while(l<=r)
		{
			int u=D[l++];
		
			ans=max(ans,dp[u]);
			for(int i=H[u];i;i=e[i].ne)
			{
				int v=e[i].to;
				dp[v]=max(dp[v],dp[u]+val[v]);
				ds[v]--;
				if(!ds[v])D[++r]=v;
			}
		}
		
		if(l<tot)return -1;
		return ans;
	}
	
	int son[1000010][4],rt[400010],Tl[400010],Tr[400010];
	
	
	
	
	void c(int u,int l,int r,int w,int x,int u2)
	{
		
		if(u2)add(u,u2);
		if(l==r)
		{
			add(u,x);
			return ;
		}
		int mid=(l+r)>>1;
		if(w<=mid)
		{
			son[u][0]=++tot;
			son[u][1]=son[u2][1];			
			add(u,tot);
			c(tot,l,mid,w,x,son[u2][0]);
		}
		else
		{
			son[u][1]=++tot;	
			son[u][0]=son[u2][0];			
			add(u,tot);
			c(tot,mid+1,r,w,x,son[u2][1]);
		}
	}
	
	void jt_q(int u,int l,int r,int L,int R,int w)
	{
	//	cout<<u<<' '<<l<<' '<<r<<endl;
		if(!u||L>R||L>r||l>R)return ;
		
		if(L<=l&&R>=r)
		{
		//	cout<<u<<endl;
			add(w,u);
			return ;
		}
		int mid=(l+r)>>1;
		jt_q(son[u][0],l,mid,L,R,w);
		jt_q(son[u][1],mid+1,r,L,R,w);
	}
	
	struct node2
	{
		int len,id;
		int l,r;
	}zfc[400010];
	bool cmp2(node2 a,node2 b)
	{
		if(a.len==b.len)return a.id<b.id;
		return a.len>b.len;
	}
	
	int qr(int l,int r)
	{
		int k=log(r-l+1)/log(2);
		return min(st[l][k],st[r-(1<<k)+1][k]);
	}
	
	int  read(){
	int x = 0,y = 0,c = getchar();
	while(c < '0' || c > '9') y = c,c = getchar();
	while(c >= '0' && c <= '9') x = x * 10 + c - '0',c = getchar();
	return y == '-' ? -x : x;
}
	
	int main()
	{
		int t;
		scanf("%lld",&t);
		while(t--)
		{
			scanf("%s",S+1);
			n=strlen(S+1);
			build(n);
		
			na=read();
			for(int i=1;i<=na;i++)
			{
				zfc[i].l=read(),zfc[i].r=read();
				zfc[i].id=i,val[i]=zfc[i].len=zfc[i].r-zfc[i].l+1;
			}
			nb=read();
			for(int i=1;i<=nb;i++)
			{
				zfc[i+na].l=read(),zfc[i+na].r=read();
				zfc[i+na].id=i+na,zfc[na+i].len=zfc[i+na].r-zfc[i+na].l+1;
			}
			nm=read();
			for(int i=1;i<=nm;i++)
			{
				int a,b;
				a=read(),b=read();
				add(a,b+na);
			}
			int len=na+nb;
			tot=len;
			sort(zfc+1,zfc+1+len,cmp2);
		//	cout<<"BA ";
			int now=0;
			for(int i=1;i<=len;i++)
			{
			//	cout<<rk[zfc[i].l]<<endl;
				if(zfc[i].id<=na)
				{
					now++;
					rt[now]=++tot;
					
					c(tot,1,n,rk[zfc[i].l],zfc[i].id,rt[now-1]);
				
				}
				else
				{
				//	cout<<"IN";
					int k=rk[zfc[i].l],l=0,r=k-1,tl=k,tr=k;
					
					while(l<=r)
					{
						int mid=(l+r)>>1;
					//	if(zfc[i].id==1357+na)cout<<zfc[i].id<<' '<<i<<endl;
						if(qr(mid+1,k)>=zfc[i].len)
						{
							tl=mid;
							r=mid-1;
						}
						else l=mid+1;
					}
					l=k+1,r=n+1,tr=k;
					while(l<=r)
					{
						int mid=(l+r)>>1;
						if(qr(k+1,mid)>=zfc[i].len)
						{
							tr=mid;
							l=mid+1;
						}
						else r=mid-1;
					}
				//	if(tl==585&&tr==585&&zfc[i].id==1357+na)cout<<qr(585,k)<<' '<<zfc[i].len<<endl;
					Tl[zfc[i].id-na]=tl,Tr[zfc[i].id-na]=tr;
					jt_q(rt[now],1,n,tl,tr,zfc[i].id);
						
				}
			}
		//	cout<<"OUT\n";
//			for(int i=1;i<=nb;i++)
//			{
//				cout<<Tl[i]<<' '<<Tr[i]<<'\n';
//			}
			cout<<topo()<<'\n';
			memset(H,0,sizeof(H));
			memset(e,0,sizeof(e));
			memset(ds,0,sizeof(ds));
			memset(dp,0,sizeof(dp));
			memset(val,0,sizeof(val));
			cnt=0;
		}
		return 0;
	}
}
#undef int
int main()
{
//	freopen("string9.in","r",stdin);
//	freopen("out.out","w",stdout);
	acac::main();
	return 0;
}

开小空间RE80pts,开大了变WA60pts了qwq

2024/7/25 09:09
加载中...