有没有热心网民帮忙看一下啊
查看原帖
有没有热心网民帮忙看一下啊
115857
too_later楼主2021/9/5 20:59

FFT 字符串匹配,就WA了第一个点。

#include<bits/stdc++.h>
#define I inline
#define RI register int
#define rep(i,a,b) for(RI i=a;i<=b;++i)
#define dow(i,a,b) for(RI i=a;i>=b;--i)
using namespace std;
const int N=1.2e6+5;
const double PI=acos(-1); 
struct comp{
	double x,y;
	comp(double xx=0,double yy=0){ x=xx,y=yy; }
} a[N],b[N],x[N],y[N],z[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+b.x*a.y); }
int n,m,lim,cnt,r[N];
char s[N],c[N];
I void FFT(comp a[],int len,int op){
	rep(i,1,len) if(i<r[i]) swap(a[i],a[r[i]]);
	for(RI l=1;l<len;l<<=1){
		comp now=comp( cos(PI/l),op*sin(PI/l) );
		for(RI j=0;j<len;j+=(l<<1)){
			comp pw=comp(1,0);
			rep(k,0,l-1){
				comp x=a[j+k],y=pw*a[j+k+l];
				a[j+k]=x+y,a[j+k+l]=x-y;
				pw=pw*now;
			}
		}
	}
}
int main(){
	scanf("%d%d",&n,&m);scanf("%s%s",s,c);reverse(s,s+n);
	lim=1;while(lim<=n+m) lim<<=1,++cnt;
	rep(i,1,lim) r[i]=((r[i>>1]>>1)|((i&1)*(lim>>1)));
	rep(i,0,n-1) a[i].x=s[i]^'*'?s[i]-'a'+1:0;rep(i,0,m-1) b[i].x=c[i]^'*'?c[i]-'a'+1:0;
	rep(i,0,n-1) a[i].x=a[i].x*a[i].x*a[i].x;
	FFT(a,lim,1);FFT(b,lim,1);
	rep(i,0,lim) x[i]=x[i]+a[i]*b[i];
	rep(i,0,lim) a[i].y=a[i].x=0;rep(i,0,n-1) a[i].x=s[i]^'*'?s[i]-'a'+1:0;
	rep(i,0,lim) b[i].y=b[i].x=0;rep(i,0,m-1) b[i].x=c[i]^'*'?c[i]-'a'+1:0;
	rep(i,0,m-1) a[i].x=a[i].x*a[i].x,b[i].x=b[i].x*b[i].x;
	FFT(a,lim,1),FFT(b,lim,1);rep(i,0,lim) x[i]=x[i]+a[i]*b[i];
	rep(i,0,lim) a[i].y=a[i].x=0;rep(i,0,n-1) a[i].x=s[i]^'*'?s[i]-'a'+1:0;
	rep(i,0,lim) b[i].y=b[i].x=0;rep(i,0,m-1) b[i].x=c[i]^'*'?c[i]-'a'+1:0;
	rep(i,0,m-1) b[i].x=b[i].x*b[i].x*b[i].x;
	FFT(a,lim,1),FFT(b,lim,1);rep(i,0,lim) x[i]=x[i]-2*a[i]*b[i];
	
	FFT(x,lim,-1);
	RI sum=0;
	rep(i,n-1,m-1) if((int)(x[i].x/lim+0.5)==0) ++sum;printf("%d\n",sum);
	rep(i,n-1,m-1) if((int)(x[i].x/lim+0.5)==0) printf("%d ",i-n+2);
	return 0;
}
2021/9/5 20:59
加载中...