1. 程式人生 > >【BZOJ4259】殘缺的字串(FFT)

【BZOJ4259】殘缺的字串(FFT)

Description

Solution

考慮將子串倒過來,對於每個字元,如果是,那麼值為0,否則為Ai96
那麼我們設f(i)=j(AjBij)2AjBij,如果f(i)0,則對應位置上可以匹配上。
f(i)展開,發現是幾個卷積的形式,FFT即可。

Code

/************************************************
 * Au: Hany01
 * Date: May 31st, 2018
 * Prob: [BZOJ4259] 殘缺的字串
 * Email: 
[email protected]
************************************************/
#include<bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int, int> PII; #define File(a) freopen(a".in", "r", stdin), freopen(a".out", "w", stdout) #define rep(i, j) for (register int i = 0, i##_end_ = (j); i < i##_end_; ++ i)
#define For(i, j, k) for (register int i = (j), i##_end_ = (k); i <= i##_end_; ++ i) #define Fordown(i, j, k) for (register int i = (j), i##_end_ = (k); i >= i##_end_; -- i) #define Set(a, b) memset(a, b, sizeof(a)) #define Cpy(a, b) memcpy(a, b, sizeof(a)) #define x first #define y second #define pb(a) push_back(a)
#define mp(a, b) make_pair(a, b) #define ALL(a) (a).begin(), (a).end() #define SZ(a) ((int)(a).size()) #define INF (0x3f3f3f3f) #define INF1 (2139062143) #define Mod (1000000007) #define debug(...) fprintf(stderr, __VA_ARGS__) #define y1 wozenmezhemecaia template <typename T> inline bool chkmax(T &a, T b) { return a < b ? a = b, 1 : 0; } template <typename T> inline bool chkmin(T &a, T b) { return b < a ? a = b, 1 : 0; } inline int read() { register int _, __; register char c_; for (_ = 0, __ = 1, c_ = getchar(); c_ < '0' || c_ > '9'; c_ = getchar()) if (c_ == '-') __ = -1; for ( ; c_ >= '0' && c_ <= '9'; c_ = getchar()) _ = (_ << 1) + (_ << 3) + (c_ ^ 48); return _ * __; } const double PI = acos(-1.), eps = 1e-5; const int maxn = 1200005; int n1, n2, n, N, cnt, rev[maxn], S[maxn], T[maxn], ans[maxn]; char s1[maxn], s2[maxn]; struct Complex { double real, imag; Complex(double real = 0, double imag = 0): real(real), imag(imag) {} }S1[maxn], S2[maxn], S3[maxn], T1[maxn], T2[maxn], T3[maxn], f[maxn]; Complex operator + (Complex A, Complex B) { return Complex(A.real + B.real, A.imag + B.imag); } Complex operator - (Complex A, Complex B) { return Complex(A.real - B.real, A.imag - B.imag); } Complex operator * (Complex A, Complex B) { return Complex(A.real * B.real - A.imag * B.imag, A.real * B.imag + A.imag * B.real); } Complex operator * (double p, Complex A) { return Complex(A.real * p, A.imag * p); } inline int dcmp(double x) { if (fabs(x) < eps) return 0; return x < 0 ? -1 : 1; } inline void FFT(Complex* a, int type) { rep(i, N) if (i < rev[i]) swap(a[i], a[rev[i]]); for (int i = 2; i <= N; i <<= 1) { Complex wn = Complex(cos(2 * PI / i), sin(2 * PI / i) * type); for (int j = 0; j < N; j += i) { Complex w = Complex(1, 0); rep(k, i >> 1) { Complex x = a[j + k], y = a[j + k + (i >> 1)] * w; a[j + k] = x + y, a[j + k + (i >> 1)] = x - y; w = w * wn; } } } } int main() { #ifdef hany01 File("bzoj4259"); #endif n1 = read(), n2 = read(), scanf("%s", s1), scanf("%s", s2), reverse(s1, s1 + n1); rep(i, n1) S[i] = s1[i] == '*' ? 0 : s1[i] - 96; rep(i, n2) T[i] = s2[i] == '*' ? 0 : s2[i] - 96; for (n = n1 + n2 - 1, N = 1; N < n; ++ cnt, N <<= 1); rep(i, N) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (cnt - 1)); rep(i, n1) S1[i].real = S[i], S2[i].real = S[i] * S[i], S3[i].real = S2[i].real * S[i]; rep(i, n2) T1[i].real = T[i], T2[i].real = T[i] * T[i], T3[i].real = T2[i].real * T[i]; FFT(S1, 1), FFT(S2, 1), FFT(S3, 1), FFT(T1, 1), FFT(T2, 1), FFT(T3, 1); rep(i, N) f[i] = S3[i] * T1[i] - 2 * S2[i] * T2[i] + S1[i] * T3[i]; FFT(f, -1), cnt = 0; For(i, n1 - 1, n2 - 1) if (!(int)(f[i].real / N + .5)) ans[++ cnt] = i - n1 + 2; printf("%d\n", cnt); For(i, 1, cnt) printf("%d ", ans[i]); return 0; } //居高聲自遠,非是藉秋風。 // -- 虞世南《蟬》

相關推薦

洛谷P3803 模板多項式乘法FFT fft

n+1 swap 提示 接下來 bug ret const define %d 題目 這是一道FFT模板題 輸入格式 給定一個n次多項式F(x),和一個m次多項式G(x)。 請求出F(x)和G(x)的卷積。 輸出格式 第一行2個正整數n,m。 接下來一行n+1個數字,從低到

洛谷P3803 模板多項式乘法FFT

git pen == lex def min problem main for 傳送門 FFT我啥都不會,先坑著 1 //minamoto 2 #include<iostream> 3 #include<cstdio> 4

洛谷 3803 模板多項式乘法FFT

題目:https://www.luogu.org/problemnew/show/P3803 https://www.cnblogs.com/zwfymqz/p/8244902.html http://www.cnblogs.com/RabbitHu/p/FFT.html http://picks.lo

洛谷OJ P3803 模板多項式乘法FFT

題目思路:FFT模板題 AC程式碼: // luogu-judger-enable-o2 #include <stdio.h> #include <string.h> #include <iostream> #include <

BZOJ4259殘缺字串FFT

Description Solution 考慮將子串倒過來,對於每個字元,如果是∗∗,那麼值為00,否則為Ai−96Ai−96。 那麼我們設f(i)=∑j(Aj−Bi−j)2AjBi−jf(i)=∑j(Aj−Bi−j)2AjBi−j,如果f(i

[BZOJ4259]殘缺字串FFT

題目描述 傳送門 題目大意:給出一個模板串和一個母串,問模板串在母串中出現過幾次。帶萬用字元。 題解 這道題和兩個串那道題是差不多的。。 令F(i)表示將模板串的最後一個懟到母串的第i個是否能

BZOJ4259殘缺字串

題面 1684 -- 【BZOJ4259】殘缺的字串 Description 很久很久以前,在你剛剛學習字串匹配的時候,有兩個僅包含小寫字母的字串A和B,其中A串長度為m,B串長度為n。可當你現在再次碰到這兩個串時,這兩個串已經老化了,每個串都有不同程度的殘缺。 你想對這兩個串重新進行匹配,其中A為模

BZOJ4259 殘缺字串

【題目連結】 【前置技能】 FFT/NTT 【題解】 字串中出現了萬用字元,一般的字串演算法就失去效果了。 先忽略萬用字元的問題。令每個位置Ak=∑i=0LenT−1(Si+k−LenT+1−Ti)Ak=∑i=0LenT−1(Si+k−LenT

JavaScriptArray 物件[並列陣列、多維陣列、陣列字串相互轉換]

  使用陣列儲存資料,常常允許用一個指令碼查詢陣列中是否有某一個值(可能驗證使用者輸入到文字框中的資料是否是可接受的)。另外,在查詢匹配的項時,指令碼可以在另一個數組中查詢一些相關的資訊。完成這個任務的 一種方式是使用兩個或多個並行陣列 另一種方式是模擬多維

模板負環spfa

sizeof 貪心 com image 一行 clas 存在 cst -m 洛谷——P3385 【模板】負環 題目描述 暴力枚舉/SPFA/Bellman-ford/奇怪的貪心/超神搜索 輸入輸出格式 輸入格式: 第一行一個正整數T表

BZOJ4259 殘缺的字符串

can isp efi amp inpu 包含 define typedef ans Description 很久很久以前,在你剛剛學習字符串匹配的時候,有兩個僅包含小寫字母的字符串A和B,其中A串長度為m,B串長度為n。可當你現在再次碰到這兩個串時,這兩個串已經老化

模板矩陣加速數列

cst opera name 結果 ++ 取余 int 數列 names 題目描述 a[1]=a[2]=a[3]=1 a[x]=a[x-3]+a[x-1] (x>3) 求a數列的第n項對1000000007(10^9+7)取余的值。 輸入輸出格式 輸入格式: 第一行一

SVM入門線性分類器的求解——問題的轉化,直觀角度

content cli 樣本 image ges 五個 是你 角度 spa SVM入門(六)線性分類器的求解——問題的轉化,直觀角度 讓我再一次比較完整的重復一下我們要解決的問題:我們有屬於兩個類別的樣本點(並不限定這些點在二維空間中)若幹,如圖, 圓形的樣本點定為正樣

leetcodeWord Breakpython

條件 text for -m 是我 tex eas sso false 思路是這種。我們從第一個字符開始向後依次找,直到找到一個斷句的地方,使得當前獲得的子串在dict中,若找到最後都沒找到。那麽就是False了。 在找到第一個後,接下來找下一個斷句處,當然是從第

JMeter學習參數化

一個 ngx adr conf 英文逗號 .net 註意 itl ron JMeter也有像LR中的參數化,本篇就來介紹下JMeter的參數化如何去實現。 參數化:錄制腳本中有登錄操作,需要輸入用戶名和密碼,假如系統不允許相同的用戶名和密碼同時登錄,或者想更好的模擬多個

JMeter學習元件的作用域與執行順序

ces ner 處理器 規則 fig 子節點 控制器 conf 節點 1.元件的作用域 JMeter中共有8類可被執行的元件(測試計劃與線程組不屬於元件),這些元件中,取樣器是典型的不與其它元件發生交互作用的元件,邏輯控制器只對其子節點的取樣器有效,而其它元件(config

JMeter學習錄制腳本

使用 get 運行 喜歡 錄制完成 帶來 免費 sdn title ---------------------------------------------------------------------------------------------------- 環境

P1939 模板矩陣加速數列

include algo pid str ostream 格式 矩陣加速 continue pri 鏈接: P1939 【模板】矩陣加速(數列) 題目描述 a[1]=a[2]=a[3]=1 a[x]=a[x-3]+a[x-1] (x>3) 求a數列的第n項對

Fortinet飛塔FortiGate防火墻低端產品命令行下配置RIP

rip fortinet forgate 飛塔防火墻 命令行配置rip 前言:FortiGate中端、高端產品支持web頁面配置RIP/OSPF/BGP,低端(桌面級)產品不支持,只支持CLI配置------雖然官網有手冊(英文版),但沒有實際案例,並給出建立連接的結果來的舒服~~這就是此