[BZOJ3160]萬徑人蹤滅(FFT + Manacher)
Address
Solution
- 先不考慮選出的字元是否為連續的一段
- 考慮列舉對稱軸 (如果對稱軸在原串第 個字元則對稱軸為 ,如果在第 和第 個字元之間則為 )
- 如果有 對字元關於對稱軸 對稱,則可以為答案貢獻 (實際上可能不是 ,注意空串、恰好在對稱軸上的字元等細節)
- 考慮求 表示以 為對稱軸,滿足 且原串第 和第 個字元相同的有序二元組 個數
- 把字元 和字元 分開處理
- 定義序列 的第 個元素表示原串第 個字元是否為 ,是則為 ,否則為
- 序列 的第 個元素表示原串第 個字元是否為 ,是則為 ,否則為
- 那麼
- 是一個卷積的形式
- 直接上 FFT ,
- 然後去掉字元為連續一段的方案數
- 將原串用無關字元隔開之後, Manacher 求迴文半徑,設為
- 最後統計答案時,對於一個
- 如果 為奇數(對稱軸在兩個字元之間)時為答案貢獻
- 否則 為偶數(對稱軸為一個字元),為答案貢獻
- 複雜度
Code
#include <bits/stdc++.h>
#define For(i, a, b) for (i = a; i <= b; i++)
#define Pow(k, n) for (k = 1; k < n; k <<= 1)
#define Step(i, a, b, x) for (i = a; i <= b; i += x)
typedef std::complex<double> cplx;
template <class T>
T Min(T a, T b) {return a < b ? a : b;}
template <class T>
void Swap(T &a, T &b) {T t = a; a = b; b = t;}
const int N = 1e5 + 5, M = N << 1, L = 3e5 + 5, ZZQ = 1e9 + 7;
const double pi = acos(-1.0);
int n, m, r[M], rev[L], ff = 1, tot = 0, ans, p2[N], ansa[M], ansb[M];
char s[N], t[M];
cplx a[L], b[L];
void manacher()
{
int i, mx = 0, pos = 0;
For (i, 1, m)
{
r[i] = mx > i ? Min(r[(pos << 1) - i], mx - i) : 1;
while (t[i - r[i]] == t[i + r[i]]) r[i]++;
if (i + r[i] > mx) mx = i + r[i], pos = i;
}
}
void FFT(int n, cplx *a, int op)
{
int i, j, k;
For (i, 0, n - 1) if (i < rev[i]) Swap(a[i], a[rev[i]]);
Pow(k, n)
{
cplx x(cos(pi / k), sin(pi / k) * op);
Step (i, 0, n - 1, k << 1)
{
cplx w(1, 0);
For (j, 0, k - 1)
{
cplx u = a[i + j], v = w * a[i + j + k];
a[i + j] = u + v;
a[i + j + k] = u - v;
w *= x;
}
}
}
}
int main()
{
int i;
scanf("%s", s + 1);
n = strlen(s + 1);
p2[0] = 1;
For (i, 1, n) p2[i] = 2 * p2[i - 1] % ZZQ;
t[0] = '%'; t[m = 1] = '#';
For (i, 1, n) t[++m] = s[i], t[++m] = '#';
t[m + 1] = '^';
For (i, 1, n)
if (s[i] == 'a') a[i] = 1, b[i]
相關推薦
[BZOJ3160]萬徑人蹤滅(FFT + Manacher)
Address
洛谷 P4199 BZOJ 3160
Solution
先不考慮選出的字元是否為連續的一段
考慮列舉對稱軸
i
[BZOJ3160]萬徑人蹤滅(FFT+manacher)
題目描述
傳送門
題目大意:在一個只含ab的字串中選取一個子序列,使得:1、字元和下標都關於一箇中心對稱2、不能是連續的一段。求方案數。
題解
這題我的方法好蠢啊→_→
首先容斥一下,答案=所
萬徑人蹤滅(FFT+manacher)
傳送門
這題……我覺得像我這樣的菜雞選手難以想出來……
題目要求求出一些子序列,使得其關於某個位置是對稱的,而且不能是連續一段,求這樣的子序列的個數。這個直接求很困難,但是我們可以先求出所有關於某個位置對稱的子序列,最後減去子串的個數。
子串個數可以用\(manacher\)求,至於子序列的話,我們假設
BZOJ3160: 萬徑人蹤滅(FFT,迴文自動機)
BZOJ傳送門:
解題思路:
FFT在處理卷積時可以將自己與自己卷,在某一種字母上標1其他標0,做字符集次就好了。
(迴文就是直接對稱可以聯絡偶函式定義理解,根據這個性質就可以將字串反向實現字串匹配)。
最後利用容斥迴文字元2的次冪-迴文串就好了。
迴文串計數當然要回文自動機了。
程式碼:
BZOJ3160 萬徑人蹤滅 【fft + manacher】
mem getc details namespace ret get fin 運算 main
題解
此題略神QAQ
orz po神牛
由題我們知道我們要求出:
回文子序列數 - 連續回文子串數
我們記為ans1和ans2
ans2可以用馬拉車輕松解出,這裏就不贅
【BZOJ3160】 萬徑人蹤滅(FFT,manacher)
while 這一 def bzoj fin long long bzoj3160 string.h pac 前言
多項式真的很難♂啊qwq
Solution
考慮求的是一個有間隔的回文串,相當於是:
總的答案-沒有間隔的答案
考慮總的答案怎麽計算?FFT卷一下就好了。
對於
FFT+manacher--bzoj3160: 萬徑人蹤滅
傳送門
一道隱蔽的
F
F
T
BZOJ3160:萬徑人蹤滅(FFT,Manacher)
Solution
$ans=$迴文子序列$-$迴文子串的數目。
後者可以用$manacher$直接求。
前者設$f[i]$表示以$i$為中心的對稱的字母對數。
那麼迴文子序列的數量也就是$\sum_{i=0}^{n-1}2^{f[i]-1}$
構造兩個陣列$
BZOJ3160: 萬徑人蹤滅
one 題意 spa b2b 背景 amp double 中間 def n<=1e5的ab串,問對稱的不連續的回文子序列數。取模。
雖然是道卷積題但是根本看不出來耶!
好吧沒關系,要熟悉卷積那個圖形:(紅箭頭那裏是交於一點的,如果你覺得不是就是近視加深了)
好來看這
BZOJ3160 萬徑人蹤滅
www. 最長回文 部分 lin 就是 etc printf -o 題解 BZOJ3160 萬徑人蹤滅
題目大意
給定一個字符串\(S\),\(|S|=n\),字符集為\(\{a,b\}\)
現在要求滿足下面條件的子序列個數:
滿足其存在一個對稱中心(是回文子序列)。
至
[bzoj3160]萬徑人蹤滅_FFT_Manacher
萬徑人蹤滅 bzoj-3160
題目大意:給定一個ab串。求所有的子序列滿足:位置和字元都關於某條對稱軸對稱而且不連續。
註釋:$1\le n\le 10^5$。
想法:
看了大爺的題解,OrzOrz。
因為對稱軸可以是兩個字元中間的位置,所以我們把字串按照$Manacher$的形式倍增。
我
[bzoj3160]萬徑人蹤滅
3160: 萬徑人蹤滅
Time Limit: 10 Sec Memory Limit: 256 MB Submit: 856 Solved: 487 [Submit][Status][Discuss] Description
最後的答案可以表示成所有的迴
【BZOJ3160】萬徑人蹤滅 Manacher+FFT
補集 double highlight 角度 貢獻 tdi 得到 oid iostream 【BZOJ3160】萬徑人蹤滅
Description
Input
Output
Sample Input
Sample Output
HIN
【bzoj3160】萬徑人蹤滅
lld iostream long long ostream 數組 tdi fin geo stdin Time Limit: 1000 ms Memory Limit: 256 MB
description
吐槽
fft除了模板以外的第一題!!高興ovo
題目好長
bzoj 3160 萬徑人蹤滅——FFT
題目:https://www.lydsy.com/JudgeOnline/problem.php?id=3160
似乎理解加深了。
用卷積算相同的位置;先把 a 賦成1、 b 賦成0,卷積一遍;再把 a 賦成0、 b 賦成1,卷積一遍;兩個加起來就有了每個位置的值,它表示以該位置/2(/2的位置可以是裂縫
BZOJ.3160.萬徑人蹤滅(FFT Manacher)
BZOJ 洛谷
\(Description\)
給定一個只含\(a,b\)的字串,求不連續迴文子序列個數(不連續指子序列不是連續一段,迴文要求字元和位置都關於某條對稱軸對稱)。 \(n\leq10^5\)。
\(Solution\)
不連續的限制比較麻煩。連續迴文子序列個數可以用\(manacher\
Luogu4199 萬徑人蹤滅 FFT、Manacher
傳送門
先不考慮”不是連續的一段“這一個約束條件。可以知道:第$i$位與第$j$位相同,可以對第$\frac{i+j}{2}$位置上產生$1$的貢獻(如果$i+j$為奇數表明它會對一條縫產生$1$的貢獻),而每一個位置上或縫上的滿足條件的字串的個數就是$2^\text{貢獻}-1$。把$\frac{1}
Luogu P4199/BZOJ3160 [2013湖北互測week1]萬徑人蹤滅
題目大意
給定一個長度為
n
n
n 的字串
【FFT】【Manacher】【bitset】lydsy3160 萬徑人蹤滅
3160: 萬徑人蹤滅 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 2360 Solved: 1274 [Submit][Status][Discuss] Description
Input
Output Sample
[BZOJ 3160] 萬徑人蹤滅
stdin 給定 ++ type bzoj sin blog ctype 對稱 題意
給定一個長度為 n , 由 ‘a‘, ‘b‘ 組成的字符串 S .
問有多少個子序列, 滿足:
① 坐標對稱.
② 字符對稱.
③ 不連續.
n <