题意:定义*号可匹配任意字符。给出A串,B串,求A串在B中完全匹配的所有位置。
将*号视作0,则两个等长的串可匹配当且仅当Σ(a[i]-b[i])^2*a[i]*b[i]==0。将A串和B串最左边对齐,每次上式都要重算一次,不科学。所以讲A串先反转过来然后补上*号,就是卷积啦。
原来的万径人踪灭一题当中用FFT来求了回文串,这里又能玩字符串匹配,真是太6了。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define clr(a) memset(a,0,sizeof a)
#define DB double
const int MAXN = 300005;
const int MAXL = MAXN*4;
int N, M;
const DB PI = acos(-1);
struct cpx
{
DB r, i;
cpx() {}
cpx(DB a, DB b):r(a), i(b){};
inline cpx operator + (cpx b) { return cpx(r+b.r, i+b.i); }
inline cpx operator - (cpx b) { return cpx(r-b.r,