51nod 1565 模糊搜尋 FFT

2022-03-30 07:29:47 字數 1353 閱讀 4397

這。。。好強啊\(qwq\)

對四種字元分開考慮:我們設\(a[char][i]\)表示在第乙個串\(s\)中,對於\(char \in \\)來說\(i\)位置是否能模糊匹配,換言之,若\(s[i]==char\),則\(a[char][j]=1,j\in [i-k,i+k]\)。

而對於第二個串\(t\)不做特殊處理,直接\(b[char][i]=[t[i]==char]\)。

我們在不加優化時,計算答案是\(o(n^2)\)的

for(r i=0;i<=lens-lent;++i) for(r j=1;j<=lent;++j) if(a[char][i+j]&&b[char][j]) ++c[i];
最後需要統計\(tmp=\sum [t[i]==char]\),若\(c[i]==tmp\)表示對\(char\)匹配成功。

所以我們要做\(4\)遍,對於每乙個字元都做一遍。

考慮優化\(o(n^2)\)的過程:我們發現把\(t\)和\(b\)倒過來的話,上面的列舉相當於是乙個卷積。

於是我們可以\(fft\)。

#include#include#include#include#define r register int

using namespace std;

namespace luitaryi const int n=524292; const double pi=acos(-1.0);

int n,m,anss,k,k=1,l,l1,l2,p[n],a[4][n],b[4][n],c[n];

char s[n];

bool ans[n];

struct complex

complex(double _x,double _y)

complex operator + (const complex& that)

complex operator - (const complex& that)

complex operator * (const complex& that)

}f[n],h[n];

inline int cvt(const char& c)

inline void fft(complex* a,short op) scanf("%s",s); for(r i=0;i>1]>>1)|((i&1)<<(l-1));

for(r i=l2-1;i<=n-2;++i) ans[i]=1;

for(r i=0;i<4;++i) {

memset(f,0,sizeof(complex)*(k+2)),memset(h,0,sizeof(complex)*(k+2));

for(r j=0;j2019.08.12

88

51nod 牛奶 bfs深度優先搜尋

農民約翰有三個容量分別是 a,b,c 公升的桶,a,b,c 分別是三個從1到20的整數。最初,a 和 b 桶都是空的,而 c 桶是裝滿牛奶的。有時,農民把牛奶從乙個桶倒到另乙個桶中,直到被灌的桶裝滿或原桶空了。灌注的過程中牛奶不會灑出來。找出當 a 桶是空的時候,c 桶中牛奶所剩量的所有可能性。輸入...

51nod 棋盤行走 深度優先搜尋

原樣題目連線 給乙個 n m 的棋盤,棋盤每個格仔顏色都是乙個大寫字母,以乙個格仔為起點,每次只能走上下左右四個方向,並且每個格仔只能走一次,要求 至少經過四個顏色相同的不同格仔最終走回起點 若可以輸出 yes,否則 no.直接 dfs,一直忘記回溯起點,wa到蹦 唉 後來考慮了下,的確完全沒必要用...

51Nod基礎題 1384 全排列(搜尋)

給出乙個字串s 可能又重複的字元 按照字典序從小到大,輸出s包括的字元組成的所有排列。例如 s 1312 輸出為 1123 1132 1213 1231 1312 1321 2113 2131 2311 3112 3121 3211 input 輸入乙個字串s s的長度 9,且只包括0 9的阿拉伯數...