luogu P6097 子集卷積 FST FWT

2022-02-04 18:39:03 字數 675 閱讀 7399

link:子集卷積

學了1h多 終於看懂是怎麼回事了(題解寫的不太清楚 翻了好幾篇部落格才懂

乙個需要用到的性質 二進位制位為1個數是i的二進位制數s 任意兩個沒有子集關係。挺顯然。

而fst就是利用這個性質靠fwt做的。

直接說做法:

定義\(f_\)表示|s|為i狀態為s的值.

對於另乙個g陣列也同時定義。設答案為h.

那麼有 \(h_=\sum_f_\cdot \sum_g_\)

暴力做這個還是\(3^n\) 但是可以發現此時限制鬆動了對於第二個狀態我們不再要求交集為空了 但是如果交集不為空在第乙個限制下.

就會出現依然合法的情況. 所以只需要對\(f_j,g_\)進行或卷積即可.

const int maxn=300010,gg=3;

int n,maxx;

int sum[1<<20];

int a[22][1<<20],b[22][1<<20],f[22][1<<20];

inline int add(int x,int y)

inline int mux(int x,int y)

inline void fwt(int *a)

rep(0,maxx,i)put_(f[sum[i]][i]);return 0;

}

luogu P1880 石子合併

原題原題原題原題原題 先貼上錯誤 錯誤 include include include using namespace std int f 1100 1100 f2 1100 1100 st 1100 a 1100 int main for int i n 1 i 2 n i st i st i 1...

Luogu P3856公共子串(DP)

題目鏈結 dp。設last i j 是第i個串字元 j 所在的最後的位置,f i j k 是第乙個串匹配到i,第二個串匹配到j,第三個串匹配到k,最多的公共子串數。那麼我們三重迴圈i j k,每次更新last陣列的值。然後在三重迴圈內部再加一重迴圈從 a 到 z 列舉公共子串的最後乙個字元是什麼。然...

luogu P2408 不同子串個數

考慮反向操作,去計算有多少組相同的子串,對於一組大小為k的極大相同子串的集合,ans k 1。為了避免重複計算,需要一種有效的,有順序的記錄方案。比如說,對於每乙個相同組,按其起始點所在的位置排序,對於除了第乙個串以外的串,均記 1的貢獻。但這種東西是非常難以快速統計的。但是,可以對於每乙個相同組,...