BZOJ4624 : 农场种植

设$A[i][j]=[a[i][j]=G],B[i][j]=[b[i][j]=L]$,枚举右下角,则对应$(A-B)^2$的和就是匹配成功的格子数。

$(a-b)^2=a^2+b^2-2ab$,将矩阵展开成一维,然后将$B$翻转,用FFT求出$\sum a\times b$即可。

时间复杂度$O(BRC\log(RC))$。

 

#include
#include
#include
using namespace std;
const int N=530000,M=505;
int Case,T,r,c,n,m,i,j,k,pos[N],tmp,val,s[M][M],ans,sx,sy,c0,c1;char a[M][M],b[M][M];
struct comp{
  double r,i;comp(double _r=0,double _i=0){r=_r;i=_i;}
  comp operator+(const comp&x){return comp(r+x.r,i+x.i);}
  comp operator-(const comp&x){return comp(r-x.r,i-x.i);}
  comp operator*(const comp&x){return comp(r*x.r-i*x.i,r*x.i+i*x.r);}
  comp conj(){return comp(r,-i);}
}A[N],B[N];
const double pi=acos(-1.0);
void FFT(comp a[],int n,int t){
  for(int i=1;i>1]>>1|((i&1)<=n)tmp-=s[i-n][j];
      if(j>=m)tmp-=s[i][j-m];
      if(i>=n&&j>=m)tmp+=s[i-n][j-m];
      tmp-=(int(B[i*c+j].r+0.5))*2;
      if(tmp>ans)ans=tmp,sx=i-n+1,sy=j-m+1;
    }
    for(c0=c1=i=0;i

  

你可能感兴趣的:(BZOJ4624 : 农场种植)