【BZOJ4259】殘缺的字串(FFT)
Description
Solution
考慮將子串倒過來,對於每個字元,如果是,那麼值為,否則為。
那麼我們設,如果為,則對應位置上可以匹配上。
將展開,發現是幾個卷積的形式,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
2018.11.17 bzoj4259: 殘缺的字串(fft)
傳送門 f f t fft
[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
【JavaScript】Array 物件(二)[並列陣列、多維陣列、陣列字串相互轉換]
使用陣列儲存資料,常常允許用一個指令碼查詢陣列中是否有某一個值(可能驗證使用者輸入到文字框中的資料是否是可接受的)。另外,在查詢匹配的項時,指令碼可以在另一個數組中查詢一些相關的資訊。完成這個任務的 一種方式是使用兩個或多個並行陣列 另一種方式是模擬多維
【模板】負環(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入門(六)線性分類器的求解——問題的轉化,直觀角度 讓我再一次比較完整的重復一下我們要解決的問題:我們有屬於兩個類別的樣本點(並不限定這些點在二維空間中)若幹,如圖, 圓形的樣本點定為正樣
【leetcode】Word Break(python)
條件 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配置------雖然官網有手冊(英文版),但沒有實際案例,並給出建立連接的結果來的舒服~~這就是此