規定模式串為 \(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 ...