原來只會兩個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...