95pts求助
查看原帖
95pts求助
285617
黑影洞人楼主2022/8/18 21:46
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#define N 1919810
#define p 1000000007
#define int long long
using namespace std;
int fi[N],ps[N],tot,base=131,t,n;
int a[N],b[N];
string lz;
void csh_hash(){
	fi[0]=1;
	for(int i=1;i<=1919810;i++)fi[i]=fi[i-1]*base;
}
struct string_hash{
	int h[N];
	void set(string s){
		int n=s.size();
		for(int i=0;i<n;i++)h[i]=h[i-1]*base+(s[i]-'a'+1);
	}
	int query(int l,int r){return h[r]-h[l-1]*fi[r-l+1];}
}hs;
int lcs(int x,int y,int len){
	int l=0,r=len;
	while(l<=r){
		int mid=(l+r)>>1;
		if(hs.query(x-mid+1,x)==hs.query(y-mid+1,y))l=mid+1;
		else r=mid-1; 
	}
	return r;
}
int lcp(int x,int y,int len){
	int l=0,r=n-y+1;
	while(l<=r){
		int mid=(l+r)>>1;
		if(hs.query(x,x+mid-1)==hs.query(y,y+mid-1))l=mid+1;
		else r=mid-1; 
	}
	return r;
}
signed main(){
	scanf("%lld",&t);
	csh_hash();
	while(t--){
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		cin>>lz;
		lz="0"+lz;
		hs.set(lz);
		n=lz.size()-1;
		for(int len=1;len<=(n>>1);len++){
			int j=len,k=len*2;
			while(k<=n){
				int l=max(k-lcs(j,k,len)+len,k);
				int r=min(k+lcp(j,k,len)-1,k+len-1);
				if(l<=r){
					b[l]++;
					b[r+1]--;
					a[l-2*len+1]++;
					a[r-2*len+2]--;
				}
				j+=len,k+=len;
			}
		}
		for(int i=1;i<=n;i++)a[i]+=a[i-1],b[i]+=b[i-1];
		int ans=0;
		for(int i=1;i<=n-1;i++)ans=(ans+a[i+1]*b[i])%p;
		printf("%lld\n",ans);
	}
	return 0;
}


验证码when祭

2022/8/18 21:46
加载中...