求调
  • 板块P6216 回文匹配
  • 楼主_JF_殉情
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/12/28 13:15
  • 上次更新2023/12/28 17:56:20
查看原帖
求调
361141
_JF_殉情楼主2023/12/28 13:15

/ll

#include<bits/stdc++.h>
using namespace std;
#define int long long 
const int N =1e7+10;
const int mod=(1ll<<32);
int n,m,a[N],s1[N],b[N],f[N],rad[N],R,C;
char s[N],t[N],S[N];
void init(int len){
	f[0]=-1;
	int i=1,j=-1;
	while(i<=len){
		while(t[j+1]!=t[i+1]&&j!=-1)
			j=f[j];
		f[i++]=++j;
	}
}
void KMP(int len){
	int j=0;
	for(int i=1;i<=strlen(s+1);i++){
		while(j!=-1&&s[i]!=t[j+1])	j=f[j];
		j++;
		if(j==len)	a[i-len+1]++;
	}
}
void manacher(){
	rad[1]=R=C=1;
	for(int i=2;i<=n;i++){
		if(i<=R)	rad[i]=min(rad[2*C-i],R-i); 
		while(s[i-rad[i]]==s[i+rad[i]]&&i-rad[i]>=1&&i+rad[i]<=n)	
			++rad[i];
		if(i+rad[i]-1>R)	C=i,R=i+rad[i]-1;
	}
}
void Slove(){
	int ans=0;
	for(int i=1;i<=n;i++)	b[i]=(b[i-1]+a[i])%mod;
	for(int i=1;i<=n;i++)	s1[i]=(s1[i-1]+b[i])%mod;
	for(int i=1;i<=n;i++){
		int p=(m-1)/2;
		if(rad[i]<p)	continue;
		ans+=((s1[i+rad[i]-m]%mod+mod-s1[i+p-m]%mod)+mod-(s1[i-p-1]%mod+mod-s1[i-rad[i]-1]%mod))%mod;
		ans%=mod;
	}
	cout<<ans<<endl;
}
signed main(){
	cin>>n>>m;
	scanf("%s",s+1),scanf("%s",t+1);
	init(strlen(t+1)),KMP(strlen(t+1)),manacher(),Slove();
}
2023/12/28 13:15
加载中...