fft 與字串匹配

2022-06-25 20:00:16 字數 2207 閱讀 1851

規定模式串為 \(s\),\(t\) , 且 \(|s| \ge |t|\)

定義匹配函式 \(p(s,t)=(s-t)^2\)

那麼對於 \(\displaystyle h(r)=\sum_^ p(s_,t_i)\),若 \(h(r)\) 為 \(0\) 則在 \(r\) 位置完全匹配。

嘗試展開 \(h\):

\[\begin

h(r) &= \sum_^ p(s_,t_i) \\

&= \sum_^ p(s_,t_i) \\

&= \sum_^ (s_)^2 - 2s_t_i + t_i^2 \\

&= \sum_^ (s_)^2 + t_i^2 - \sum_^ 2s_t_i

\end\]

第乙個和式可以很快處理出來。

第二個和式發現下標 \(i\) 均為加,所以考慮反轉 \(t\) 串寫成卷積形式

為了不考慮下標問題,\(t\) 串外的部分的值看作 \(0\) , 這樣就不會對答案產生影響。

\[\begin

h(r) &= \sum_^ (s_)^2 + t_i^2 - \sum_^ 2s_t_ \\

&= \sum_^ (s_)^2 + t_i^2 - \sum_^ 2s_t_

\end\]

複雜度 \(\mathcal o(n \log n)\)

為了消除萬用字元的影響,定義萬用字元的值為 \(0\)。

定義匹配函式 \(p(s,t)=(s-t)^2st\) , \(h\) 同上,同理得:

\[\begin

h(r) &= \sum_^ p(s_,t_i) \\

&= \sum_^ p(s_,t_i) \\

&= \sum_^ (s_)^3t_i - 2(s_)^2t_i^2 + t_i^3s_ \\

\end\]

同 1 的套路反轉 \(t\)

\[\begin

h(r) &= \sum_^ (s_)^3t_ - 2(s_)^2(t_)^2 + (t_)^3s_ \\

&= \sum_^ (s_)^3t_ - 2(s_)^2t_^2 + (t_)^3s_

\end\]

三次多項式乘法即可完成。

#include #include #include #include #include #include using namespace std;

#define pi acos( -1 )

#define eps 1e-8

//#define double long double

const int maxn = 1.2e6;

struct complex

complex( double x , double y )

complex operator * ( const double &a ) const

complex operator / ( const double &a ) const

complex operator + ( const complex &a ) const

complex operator - ( const complex &a ) const

complex operator * ( const complex &a ) const

};#define poly vector< complex >

#define len( x ) ( (int)x.size() )

int lim , rev[ maxn + 5 ];

void fft( poly &f , int op )

} } if( op == -1 ) for( int i = 0 ; i < lim ; i ++ ) f[ i ] = f[ i ] / lim;

}poly operator * ( poly f , poly g )

poly operator + ( poly f , poly g )

poly operator - ( poly f , poly g )

poly operator * ( double p , poly f )

poly operator / ( double p , poly f )

int n , m;

char s[ maxn + 5 ] , t[ maxn + 5 ];

poly f , g , h;

int main()

P4173 殘缺的字串 FFT字串匹配

p4173 殘缺的字串 fft字串匹配 p4173 經典套路將模式串翻轉,將 設為0,設以目標串的x位置匹配結束的匹配函式為 p x sum a m 1 i b x m 1 i 2a m 1 i b x m 1 i 展開之後化簡為 p x sum a 3 i b j 2 sum a 2 i b 2 ...

字串搜尋與匹配

學分貴學分貴,學了就要會!廢話不多說,下面將對一些常見的基於文字的相似性演算法做一下總結,一些很經典的演算法這裡會給出來實現。neighbourhood search n gram distance edit distance 接下來主要對這些演算法的原理做乙個介紹,然後給出相應的演算法。接下來主要...

字串匹配

題目描述 讀入資料string 然後讀入乙個短字串。要求查詢string 中和短字串的所有匹配,輸出行號 匹配字串。匹配時不區分大小寫,並且可以有乙個用中括號表示的模式匹配。如 aa 123 bb 就是說aa1bb aa2bb aa3bb都算匹配。輸入 輸入有多組資料。每組資料第一行輸入n 1 n ...