bzoj4650 優秀的拆分

2022-06-07 14:00:16 字數 672 閱讀 8574

由於字串是aabb的形式,列舉aa和bb中間的位置,分別考慮aa和bb的數量,乘起來sigma一下即為答案

以下考慮aa的情況(bb同理),列舉a的長度,然後按照這個長度分為若干塊,那麼每乙個a一定可以表示成某一段的結尾+下一段的開頭,同時兩個a又要連續,也就是相鄰兩塊的lcp和lcs,用差分來維護即可

1 #include2

using

namespace

std;

3#define n 30005

4#define mod 998244353

5#define mid (l+r+1>>1)

6int

t,n,sum[n],mi[n],f1[n],f2[n];

7long

long

ans;

8char

s[n];

9int hash(int x,int

y)14

bool pd(int x1,int y1,int x2,int

y2)17

void calc(int x,int

y)34

intmain()

53 printf("

%lld\n

",ans);54}

55 }

view code

bzoj 4650 優秀的拆分

先給大家安利乙個80分 小學生都會寫的 版本 分析 複雜度o n 3 在洛谷上測一下可以過80分 特判懶得寫,加上就90了 g i j 表示i到j之間能否構成 aa 的形式,暴力就可以出來 然後枚舉子序列長度,起點位置,以及斷點位置與起點的長度,就能找出 aabb 中a與b接壤的位置,然後左邊右邊都...

bzoj 4650 Noi2016 優秀的拆分

原來只會兩個log平衡樹合併。後來圍觀claris在uoj群上秒題後會了這道題。列舉a b 的長度l,然後列舉i kl,考慮字首i,i l和字尾i 1,i l 1,求出字首的lcp和字尾的lcp,然後合法的方案就在乙個方案內。差分一下即可。注意要避免重複。ac 如下 include include ...

BZOJ 4650 Noi2016 優秀的拆分

題解 求解每個位置向左向右aa串的個數f x g x 列舉a的長度,每a個位置設乙個關鍵點 每乙個a一定僅且跨越乙個關鍵點 然後求出相鄰關鍵點向前向後的最長公共字首的長度,這會對一段區間的f,g產生影響 用差分 字首和統計答案 include include include includeusing...