BZOJ4650 Noi2016 優秀的拆分

2022-09-15 04:03:09 字數 739 閱讀 2059

設$f_i$表示以$i$結尾的square個數,$g_i$表示以$i$開頭的square個數,則$ans=\sum_^ f_ig_$。

列舉square中長度的一半$l$,每$l$步取乙個關鍵點,那麼每個該長度的square的肯定恰好經過兩個相鄰的關鍵點,且位置差距為$l$的字元一一匹配。所以相鄰關鍵點之間通過字尾陣列求出最長公共前字尾,即可知道存在多少該長度的square。

這相當於$f$和$g$的一段區間$+1$,差分字首和後單點修改即可。

時間複雜度$o(n\log n)$。

#include#include#include#define n 60010

using namespace std;

char s[n];int t,n,i,j,log[n],l,r,f[n],g[n];long long ans;

struct ds

for(j=rk[height[i=k=0]=0];iy)swap(x,y);

return ask(x+1,y);

}}a,b;

inline int lcp(int x,int y)

inline int lcs(int x,int y)

int main()

}for(i=1;i<=n;i++)f[i]+=f[i-1],g[i]+=g[i-1];

for(ans=0,i=1;iprintf("%lld\n",ans);

} return 0;

}

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...

BZOJ4560 NOI2016 優秀的拆分

bzoj 洛谷考慮乙個形如 aabb 的串是由兩個形如 aa 的串拼起來的 那麼我們設 f i 以位置 i 為結尾的形如 aa 串的個數 g i 以位置 i 為開頭的形如 aa 串的個數 therefore ans sum nf i g i 1 題目的難點轉化為求 f,g 但是,其實我們只要 o n...