題目描述
一年一度的「幻影閣夏日品酒大會」隆重開幕了。大會包含品嚐和趣味挑戰 兩個環節,分別向優勝者頒發「首席品酒家」和「首席獵手」兩個獎項,吸引了眾多品酒師參加。
在大會的晚餐上,調酒師 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,每個標...