求助,0pts/dk
查看原帖
求助,0pts/dk
724676
Iwara_qwq楼主2022/7/28 17:40
#include<bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef long double ldb;
using namespace std;
namespace Yorihime_Nao{
	template<class T> T MAX(T x,T y){
		return x>y?x:y;
	}
	template<class T> T MIN( T x,T y){
		return x<y?x:y;
	}
	template<class T,class ... Arg> T MAX(T x,T y,Arg ... arg){
		return MAX(x>y?x:y,arg...);
	}
	template<class T,class ... Arg> T MIN(T x,T y,Arg ... arg){
		return MIN(x<y?x:y,arg...);
	}
	template<class T> T lowbit(T x){
		return x&-x;
	}
	template<class T> void SWAP(T &x,T &y){
		x^=y^=x^=y;
		return;
	}
}
using namespace Yorihime_Nao;
const ll MAXN=3e6+5;
ll n,m; 
char ch1[MAXN],ch2[MAXN],s[MAXN<<1],t[MAXN<<1];
ll tree[MAXN<<1],pi[MAXN<<1],b[MAXN<<1];
void update(ll x,ll delta){
	while(x<=n){
		tree[x]+=delta;
		x+=lowbit(x);
	}
	return;
}
ll query(ll x){
	ll res=0;
	while(x){
		res+=tree[x];
		x-=lowbit(x);
	}
	return res;
}
void pre(char *txt){
	ll len=strlen(txt+1),j=0;
	pi[1]=0;
	for(int i=2;i<=len;i++){
		while(j&&txt[j+1]!=txt[i])j=pi[j];
		if(txt[j+1]==txt[i])j++;
		pi[i]=j;
	}
	return;
}
void kmp(char *word,char *txt){
	ll j=0,len1=strlen(word+1),len2=strlen(txt+1);
	for(int i=1;i<=len1;i++){
		while(j&&word[i]!=txt[j+1])j=pi[j];
		if(txt[j+1]==word[i])j++;
		if(j==len2){
			update(i-len2+1,1),j=pi[j];
//			cout<<i<<endl;
		}
	}
	return;
}
ll manacher(char *txt){
	ll len=strlen(txt+1),ans=0;
	for(int i=1,l=1,r=0;i<=len;i++){
		ll k=i>r?1:MIN(b[l+r-i],r-i+1ll);
		while(i-k>=1&&i+k<=len&&txt[i-k]==txt[i+k]){
			if(i+k-m>i-k)ans+=query(i+k+1-m)-query(i-k-1);
			k++;
		}
		b[i]=k--;
		if(i+k>r)l=i-k,r=i+k;
	}
	return ans;
}
int main(){
	cin>>n>>m;
	cin>>(ch1+1)>>(ch2+1);
	s[1]=t[1]='W';
	for(int i=1;i<=n;i++)s[i<<1]=ch1[i],s[i<<1|1]='W';
	n=n<<1|1;
	for(int i=1;i<=m;i++)t[i<<1]=ch2[i],t[i<<1|1]='W';
	m=m<<1|1;
//	cout<<(s+1)<<" "<<(t+1)<<endl;
	pre(t);
//	for(int i=1;i<=m;i++)cout<<pi[i]<<" ";
//	cout<<endl;
	kmp(s,t);
//	for(int i=1;i<=n;i++)cout<<query(i)<<" ";
	cout<<manacher(s);
	return 0;
}

2022/7/28 17:40
加载中...