洛谷过了 LOJ TLE #2 #3
查看原帖
洛谷过了 LOJ TLE #2 #3
137242
DiaоsiKreator楼主2024/7/2 22:47

求卡常

#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
using namespace std;
const int N=1000010,M=2000010,INF=0x3f3f3f3f;
inline int max(int x,int y){return x>y?x:y;}
inline int min(int x,int y){return x<y?x:y;}
inline void swap(int &x,int &y){x^=y^=x^=y;}
int head[N],ver[M],Next[M],tot;
int T,n,m,rt,ans,sz[N],vis[N],f[N][2],c[N];
char s[N],t[N];
ull h0[N],h1[N],h2[N],p[N];
void add(int x,int y){
	ver[++tot]=y,Next[tot]=head[x],head[x]=tot;
}
void get_rt(int x,int fa,int sum){
	sz[x]=1;
	int flg=1;
	for(int i=head[x];i;i=Next[i]){
		int y=ver[i];
		if(vis[y]||y==fa)continue;
		get_rt(y,x,sum);
		sz[x]+=sz[y];
		if(sz[y]>sum/2)flg=0;
	}
	if(flg&&sum-sz[x]<=sum/2)rt=x;
}
void dp(int x,int dep){
	h2[dep]=h2[dep-1]*131+s[x]-'A'+1;
	if(dep<m){
		f[dep][0]=(h2[dep]==h0[m]-p[dep]*h0[m-dep]);//suffix
		f[dep][1]=(h2[dep]==h1[m]-p[dep]*h1[m-dep]);//prefix
	}
	else{
		f[dep][0]=(f[dep-m][0]&&h2[dep]-p[m]*h2[dep-m]==h0[m]);
		f[dep][1]=(f[dep-m][1]&&h2[dep]-p[m]*h2[dep-m]==h1[m]);
	}
}
void calc(int x,int fa,int dep,int op){
	dp(x,dep);
	c[dep%m]+=op*f[dep][1];
	for(int i=head[x];i;i=Next[i]){
		int y=ver[i];
		if(vis[y]||y==fa)continue;
		calc(y,x,dep+1,op);
	}
}
void dfs(int x,int fa,int dep){
	sz[x]=1;
	dp(x,dep);
	ans+=f[dep][0]*c[(m-dep%m+1)%m];
	for(int i=head[x];i;i=Next[i]){
		int y=ver[i];
		if(vis[y]||y==fa)continue;
		dfs(y,x,dep+1);
		sz[x]+=sz[y];
	}
}
void solve(int x){
	vis[x]=1;
	f[0][0]=f[0][1]=1;
	calc(x,0,1,1);
	ans+=c[0];
	for(int i=head[x];i;i=Next[i]){
		int y=ver[i];
		if(vis[y])continue;
		calc(y,x,2,-1);
		dfs(y,x,2);
		calc(y,x,2,1);
	}
	calc(x,0,1,-1);
	for(int i=head[x];i;i=Next[i]){
		int y=ver[i];
		if(vis[y])continue;
		get_rt(y,x,sz[y]);
		solve(rt);
	}
}
void solve(){
	ans=tot=0;
	cin>>n>>m>>s+1;
	for(int i=1;i<=n;i++)head[i]=vis[i]=0;
	for(int i=1;i<n;i++){
		int x,y;
		cin>>x>>y;
		add(x,y);add(y,x);
	}
	cin>>t+1;
	p[0]=1;
	for(int i=1;i<=m;i++){
		h0[i]=h0[i-1]*131+t[i]-'A'+1;
		h1[i]=h1[i-1]*131+t[m-i+1]-'A'+1;
		p[i]=p[i-1]*131;
	}
	get_rt(1,0,n);
	solve(rt);
	cout<<ans<<'\n';
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin>>T;
	while(T--)solve();
	return 0;
}
2024/7/2 22:47
加载中...