SA NOI2015 品酒大會

2021-10-24 04:49:42 字數 3069 閱讀 8918

題目描述

一年一度的「幻影閣夏日品酒大會」隆重開幕了。大會包含品嚐和趣味挑戰 兩個環節,分別向優勝者頒發「首席品酒家」和「首席獵手」兩個獎項,吸引了眾多品酒師參加。

在大會的晚餐上,調酒師 rainbow 調製了 nn 杯雞尾酒。這 nn 杯雞尾酒排成一行,其中第 nn 杯酒 (1 ≤ i ≤ n1≤i≤n) 被貼上了乙個標籤 s_isi​

,每個標籤都是 2626 個小寫 英文本母之一。設 str(l, r)str(l,r) 表示第 ll 杯酒到第 rr 杯酒的 r - l + 1r−l+1 個標籤順次連線構成的字串。若 str(p, p_0) = str(q, q_0)str(p,p0​

)=str(q,q0​

),其中 1 ≤ p ≤ p_0 ≤ n1≤p≤p0​

≤n, 1 ≤ q ≤ q_0 ≤ n1≤q≤q0​

≤n, p ≠ qp​

=q,p_0-p+1 = q_0 - q + 1 = rp0​

−p+1=q0​

−q+1=r ,則稱第 pp 杯酒與第 qq 杯酒是「 rr 相似」 的。當然兩杯「 rr 相似」(r > 1r>1)的酒同時也是「 11 相似」、「 22 相似」、……、「 (r - 1)(r−1) 相似」的。特別地,對於任意的 1 ≤ p ,q ≤ n,p ≠ q1≤p,q≤n,p​

=q,第 pp 杯酒和第 qq 杯酒都 是「 00 相似」的。

在品嚐環節上,品酒師 freda 輕鬆地評定了每一杯酒的美味度,憑藉其專業的水準和經驗成功奪取了「首席品酒家」的稱號,其中第 ii 杯酒 (1 ≤ i ≤ n1≤i≤n) 的 美味度為 a_iai​

。現在 rainbow 公布了挑戰環節的問題:本次大會調製的雞尾酒有乙個特點,如果把第 pp 杯酒與第 qq 杯酒調兌在一起,將得到一杯美味度為 a_p\times a_qap​

×aq​ 的 酒。現在請各位品酒師分別對於 r = 0,1,2,⋯,n-1r=0,1,2,⋯,n−1 ,統計出有多少種方法可以 選出 22 杯「 rr 相似」的酒,並回答選擇 22 杯「rr 相似」的酒調兌可以得到的美味度的最大值。

輸入格式

第 11 行包含 11 個正整數 nn ,表示雞尾酒的杯數。

第 22 行包含乙個長度為 nn 的字串 ss,其中第 ii 個字元表示第 ii 杯酒的標籤。

第 33 行包含 nn 個整數,相鄰整數之間用單個空格隔開,其中第 ii 個整數表示第 ii 杯酒的美味度 a_iai​

。輸出格式

包括 nn 行。

第 ii 行輸出 22 個整數,中間用單個空格隔開。第 11 個整 數表示選出兩杯「 (i - 1)(i−1) 相似」的酒的方案數,第 2 個整數表示選出兩杯 「 (i - 1)(i−1) 相似」的酒調兌可以得到的最大美味度。若不存在兩杯「 (i - 1)(i−1) 相似」 的酒,這兩個數均為 00 。

輸入輸出樣例

輸入 #1 複製

10ponoiiipoi

2 1 4 7 4 8 3 6 4 7

輸出 #1 複製

45 56

10 56

3 32

0 00 0

0 00 0

0 00 0

0 0輸入 #2 複製

12abaabaabaaba

1 -2 3 -4 5 -6 7 -8 9 -10 11 -12

輸出 #2 複製

66 120

34 120

15 55

12 40

9 27

7 16

5 73 -4

2 -4

1 -4

0 00 0

說明/提示

【樣例說明 1】

用二元組 (p, q)(p,q) 表示第 pp 杯酒與第 qq 杯酒。

00 相似:所有 4545 對二元組都是 00 相似的,美味度最大的是 8 × 7 = 56 8×7=56。

11 相似: (1,8) (2,4) (2,9) (4,9) (5,6) (5,7) (5,10) (6,7) (6,10) (7,10) (1,8)(2,4)(2,9)(4,9)(5,6)(5,7)(5,10)(6,7)(6,10)(7,10),最大的 8 × 7 = 568×7=56 。

22 相似: (1,8) (4,9) (5,6)(1,8)(4,9)(5,6) ,最大的 4 × 8 = 324×8=32 。

沒有 3,4,5, ⋯ ,93,4,5,⋯,9 相似的兩杯酒,故均輸出 00 。

【時限1s,記憶體512m】

看到lcp,那帶字尾的演算法都能做得啦

但本蒟蒻只會sa

考慮從大到小列舉height

每處理乙個height就和旁邊合併

然後計算貢獻即可

#include

#define ll long long

using

namespace std;

const

int n=

6e5+77;

int n,v[n]

;char s[n]

;ll ans1[n]

,ans2[n]

;struct sa

void

get_sa()

for(

int i=

1; i<=n; i++

) rk[sa[i]

]=i;

for(

int i=

1,j=

0; i<=n; i++)}

}sa;

bool

cmp(

int a,

int b)

int id[n]

,f[n]

,mm[n]

,mi[n]

,siz[n]

;ll ans[n]

;intgf(

int x)

void

merge

(int x,

int y,

int len)

intmain()

Noi 2015 品酒大會

題目等價於求任意兩對字尾的lcp的值小於等於1,2 n的個數,以及權值乘積的最大值。求出字尾陣列的height值,然後預處理出每個height值能夠成為最小的區間。考慮每個height的值對答案的貢獻 如果height i 能夠成為最小的區間為 l,r 那麼個數便是 l i 1 r i 1 而乘積最...

NOI2015 品酒大會

字尾自動機 首先考慮第一問 我們先將字尾自動機建出來,考慮每個節點,它出現的次數肯定是endpos的size 我們記為num 那麼選取這個節點的串的方案數即為c num,2 num num 1 2,所能貢獻的長度區間為這個節點對應的所有串的長度即 len fa x 1 len x 1 這裡可以差分一...

NOI2015 品酒大會

一年一度的 幻影閣夏日品酒大會 隆重開幕了。大會包含品嚐和趣味挑戰 兩個環節,分別向優勝者頒發 首席品酒家 和 首席獵手 兩個獎項,吸引了眾多品酒師參加。在大會的晚餐上,調酒師 rainbow 調製了 n 杯雞尾酒。這 n 杯雞尾酒排成一行,其中第 n 杯酒 1 i n 被貼上了乙個標籤si,每個標...