bzoj 4650 Noi2016 優秀的拆分

2021-07-16 04:37:28 字數 974 閱讀 2982

原來只會兩個log平衡樹合併。。後來圍觀claris在uoj群上秒題後會了這道題。

列舉a(b)的長度l,然後列舉i=kl,考慮字首i,i+l和字尾i+1,i+l+1,求出字首的lcp和字尾的lcp,然後合法的方案就在乙個方案內。差分一下即可。注意要避免重複。

ac**如下:

#include#include#include#define n 30005

using namespace std;

int n,bin[25],lg2[n],q[n],sum[n],num[n]; char s[n];

struct saffix

for (k=1; cntk) q[++j]=sa[i]-k;

memset(sum,0,sizeof(sum));

for (i=1; i<=n; i++) sum[rnk[i]]++;

for (i=1; i<=cnt; i++) sum[i]+=sum[i-1];

for (i=n; i; i--) sa[sum[rnk[q[i]]]--]=q[i];

for (i=1,cnt=0; i<=n; i++)

for (i=1; i<=n; i++) rnk[i]=q[i];

} }void getf()

} int lcp(int x,int y)

void pwk()

}}ta,tb;

int main()

for (i=2; i<=30000; i++) if (!lg2[i]) lg2[i]=lg2[i-1];

while (cas--)

if (x<=y)

}long long ans=0;

for (i=2; i<=n; i++)

printf("%lld\n",ans);

} return 0;

}

by lych

2016.8.4

BZOJ 4650 Noi2016 優秀的拆分

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

BZOJ4650 Noi2016 優秀的拆分

設 f i 表示以 i 結尾的square個數,g i 表示以 i 開頭的square個數,則 ans sum f ig 列舉square中長度的一半 l 每 l 步取乙個關鍵點,那麼每個該長度的square的肯定恰好經過兩個相鄰的關鍵點,且位置差距為 l 的字元一一匹配。所以相鄰關鍵點之間通過字尾...

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