UVAlive 1808 Best Position(FFT)

题意:给出n×m的01矩阵,以及5次查询,给出h×w的矩阵,要求找出匹配原矩阵相同最多的位置,如果多个,上方的优先,还有多个左边的优先。

做法:一开始是用bitset瞎搞,得优化一些地方才能卡过。事实上正解是FFT。

对于原始矩阵设定第一个多项式的i*m+j的系数为s[i][j],第二个多项式的系数我们要反着设定,这样才能把对应匹配的每个位置可以乘到同一个次数,i*m+j的系数为c[h-i-1][w-j-1]。

这样乘出来的系数代表的含义就是以某个点作为左上角的矩阵匹配的值是多少了。

AC代码:

#pragma comment(linker, "/STACK:102400000,102400000")
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define ll __int64
#define ull unsigned __int64
#define eps 1e-8
#define NMAX 1000000010
#define MOD 1000000007
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define PI acos(-1)
template
inline void scan_d(T &ret)
{
    char c;
    int flag = 0;
    ret=0;
    while(((c=getchar())<'0'||c>'9')&&c!='-');
    if(c == '-')
    {
        flag = 1;
        c = getchar();
    }
    while(c>='0'&&c<='9') ret=ret*10+(c-'0'),c=getchar();
    if(flag) ret = -ret;
}
const int maxn = 500+10;

struct Complex
{
    double r,i;
    Complex() {};
    Complex(double a,double b):r(a),i(b){}
    Complex operator +(const Complex &t)const
    {
        return Complex(r+t.r,i+t.i);
    }
    Complex operator -(const Complex &t)const
    {
        return Complex(r-t.r,i-t.i);
    }
    Complex operator *(const Complex &t)const
    {
        return Complex(r*t.r-i*t.i,r*t.i+i*t.r);
    }
}ax[maxn*maxn*4],bx[maxn*maxn*4];


void fft(Complex y[], int n, int rev)
{
    for(int i=1,j,k,t; i>1,t=i; k; k>>=1,t>>=1) j=j<<1|t&1;
        if(i= len1) ax[i] = Complex(0,0);
        else ax[i] = Complex(a[i],0);
    }
//    for(int i = 0; i < len; i++)
//        cout<= len2) bx[i] = Complex(0,0);
        else bx[i] = Complex(b[i],0);
    }
//    for(int i = 0; i < len; i++)
//        cout< ans)
                {
                    ans = ans1[i]+ans2[i];
                    x = t1/m; y = t1%m;
                    xx = ans1[i]; yy = ans2[i];
                }
            }
        }
        printf("Case #%d: %d %d %d %d\n",cas++,x+1,y+1,xx,yy);
    }
    return 0;
}


你可能感兴趣的:(FFT(快速傅立叶变换),FFT)