我們考慮計算乙個串的答案,所有子串數是 \(\dfrac\),但是會存在一些本質相同的串被重複計算,所以我們考慮容斥使得每個本質相同的串只出現一次。
具體方法是列舉起點集合 \(s\),其中 \(x\in s\) 表示原串的乙個子串多次出現的左端點集合,然後長度相同的子串本質上是相同的,可以一起容斥。
時間複雜度是 \(\mathcal(n^22^n)\),實際效率在 \(n=24\) 時只用 \(3s\),感覺更像大常數的 \(n2^n\),更準確的上界不會證明。
#define m 1050000
int n, m, ans, bt[m], mt[m], fa[26], pw[26];
int get(int x)
void calc(int x)
else k++;
} rep(j, 0, x - 1)k += fa[j] == j;
if(bt[i])ad(ans, pw[k]);
else su(ans, pw[k]); }}
int main()
LeetCode C 刷題 13 16題題解
羅馬數字包含以下七種字元 i,v,x,l,c,d 和 m。字元 數值 i 1 v 5 x 10 l 50 c 100 d 500 m 1000 例如,羅馬數字 2 寫做 ii 即為兩個並列的 1。12 寫做 xii 即為 x ii 27 寫做 xxvii,即為 xx v ii 通常情況下,羅馬數字中...
洛谷 P1316 丟瓶蓋
陶陶是個貪玩的孩子,他在地上丟了a個瓶蓋,為了簡化問題,我們可以當作這a個瓶蓋丟在一條直線上,現在他想從這些瓶蓋裡找出b個,使得距離最近的2個距離最大,他想知道,最大可以到多少呢?輸入格式 第一行,兩個整數,a,b。b a 100000 第二行,a個整數,分別為這a個瓶蓋座標。輸出格式 僅乙個整數,...
洛谷 P1316 丟瓶蓋
題目描述 陶陶是個貪玩的孩子,他在地上丟了a個瓶蓋,為了簡化問題,我們可以當作這a個瓶蓋丟在一條直線上,現在他想從這些瓶蓋裡找出b個,使得距離最近的2個距離最大,他想知道,最大可以到多少呢?輸入輸出格式 輸入格式 第一行,兩個整數,a,b。b a 100000 第二行,a個整數,分別為這a個瓶蓋座標...