萌新求助,样例都过没有分
查看原帖
萌新求助,样例都过没有分
253738
听取MLE声一片楼主2021/3/16 14:09

/dk,跟着第一篇题解学的,求调

#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<map>
using namespace std;
const int mod=1e9+7;
const int N=400010;
const double PI=acos(-1);
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
int n,lim,r[N];
int s[N],ans[N],x[N],p[N],sum;
char ss[N];
struct comp{
    double x,y;
    comp(double xx=0,double yy=0){x=xx,y=yy;}
}a[N],b[N],c[N];
comp operator + (comp a,comp b){ return comp(a.x+b.x,a.y+b.y);}
comp operator - (comp a,comp b){ return comp(a.x-b.x,a.y-b.y);}
comp operator * (comp a,comp b){ return comp(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
void FFT(comp *a,int type){
	for(int i=0;i<lim;i++)
		if(i<r[i])
			swap(a[i],a[r[i]]);
	for(int i=1;i<lim;i<<=1){
		comp x(cos(PI/i),type*sin(PI/i));
		for(int j=0;j<lim;j+=(i<<1)){
			comp y(1,0);
			for(int k=0;k<i;k++,y=y*x){
				comp p=a[j+k],q=y*a[j+k+i];
				a[j+k]=p+q;
				a[j+k+i]=p-q;
			}
		}
	}
    if(type==-1){
        for(int i=0;i<=(n<<1)+1;i++)
	    	a[i].x/=lim;
    }
}
void manacher(){
    int maxn=0,mid;
    for(int i=1;i<=(n<<1)+1;i++){
        if(i<maxn)
            p[i]=min(p[(mid<<1)-i],p[mid]+mid-i);
        else p[i]=1;
        while(x[i-p[i]]==x[i+p[i]])
			p[i]++;
		if(p[i]+i>maxn){
	        maxn=p[i]+i;
	    	mid=i;
		}	
    }
}
int qpow(int x,int y){
    int num=1;
    while(y){
        if(y&1)
			num=num*x%mod;
        x=x*x%mod;
		y>>=1;
    }
    return num;
}
int main()
{
	scanf("%s",ss);
	n=strlen(ss);
    for(int i=0;i<n;i++)
    	s[i+1]=ss[i]-'a';	
    for(int i=1;i<=(n<<1)+1;i++){
        if(i%2)
			x[i]=2;
        else x[i]=s[i>>1];
    }
	x[0]=-1,x[(n+1)<<1]=-2;
	int l=0;
	for(lim=1;lim<=(n<<1);lim<<=1)
		l++;
	for(int i=0;i<lim;i++)
		r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
    for(int i=1;i<=n;i++)
		a[i].x=b[i].x=s[i];
    FFT(a,1);
	FFT(b,1);
    for(int i=0;i<=lim;i++)
		a[i]=a[i]*b[i];
    FFT(a,-1);
    for(int i=1;i<=(n<<1)+1;i++)
		ans[i]+=((int)(a[i].x+0.5)-((i&1)^1)),ans[i]%=mod;
    memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
    for(int i=1;i<=n;i++)
		a[i].x=b[i].x=(s[i]^1);
    FFT(a,1);FFT(b,1);
    for(int i=0;i<=lim;i++)
		a[i]=a[i]*b[i];
    FFT(a,-1);
    for(int i=1;i<=(n<<1)+1;i++)
    	ans[i]+=((int)(a[i].x+0.5)-((i&1)^1)),ans[i]%=mod;
    for(int i=1;i<=(n<<1)+1;i++)
		ans[i]=((ans[i]+((i&1)^1))>>1)+((i&1)^1),ans[i]%=mod;
    for(int i=1;i<=(n<<1)+1;i++)
		ans[i]=qpow(2,ans[i])-1,ans[i]%=mod;
    manacher();
    for(int i=1;i<=(n<<1)+1;i++)
		ans[i]-=(p[i]>>1),ans[i]%=mod;
    for(int i=1;i<=(n<<1)+1;i++)
		sum+=ans[i],sum%=mod;
	printf("%d",sum);
	return 0;
}
2021/3/16 14:09
加载中...