NOI2015 品酒大會

2022-05-11 11:51:17 字數 2489 閱讀 2920

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

在大會的晚餐上,調酒師 rainbow 調製了 n 杯雞尾酒。這 n 杯雞尾酒排成一行,其中第i杯酒(1≤i≤n)被貼上了乙個標籤 si,每個標籤都是 26 個小寫英文本母之一。設str(l,r)表示第 l 杯酒到第 r 杯酒的r−l+1個標籤順次連線構成的字串。若 str(p,po)=str(q,qo),其中1≤p≤po≤n,1≤q≤qo≤n,p≠q,po−p+1=qo−q+1=r,則稱第 p 杯酒與第 q 杯酒是「r相似」 的。當然兩杯「r相似」(r>1)的酒同時也是「1 相似」、「2 相似」、…、「(r−1) 相似」的。特別地,對於任意的 1≤p,q≤n,p≠q,第 p 杯酒和第 q杯酒都是「0相似」的。 

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

現在 rainbow 公布了挑戰環節的問題:本次大會調製的雞尾酒有乙個特點,如果把第 p 杯酒與第 q 杯酒調兌在一起,將得到一杯美味度為 ap∗aq 的酒。現在請各位品酒師分別對於 r=0,1,2,…,n−1,統計出有多少種方法可以選出 2 杯「r相似」的酒,並回答選擇 2 杯「r相似」的酒調兌可以得到的美味度的最大值。

輸入檔案的第 1 行包含 1 個正整數 n,表示雞尾酒的杯數。 

第 2 行包含乙個長度為 n 的字串 s,其中第 i 個字元表示第 i 杯酒的標籤。 

第 3 行包含 n 個整數,相鄰整數之間用單個空格隔開,其中第 i 個整數表示第 i 杯酒的美味度 ai。

輸出檔案包括 n 行。 

第 i 行輸出 2 個整數,中間用單個空格隔開。第 1 個整數表示選出兩杯「(i−1)相似」的酒的方案數,第 2 個整數表示選出兩杯「(i−1)相似」的酒調兌可以得到的最大美味度。 

若不存在兩杯「(i−1)相似」的酒,這兩個數均為 0。

樣例1: 

10 ponoiiipoi 

2 1 4 7 4 8 3 6 4 7

樣例2: 

12 abaabaabaaba 

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

樣例1: 

45 56 

10 56 

3 32 

0 0 

0 0 

0 0 

0 0 

0 0 

0 0 

0 0樣例2: 

66 120 

34 120 

15 55 

12 40 

9 27 

7 16 

5 7 

3 -4 

2 -4 

1 -4 

0 0 

0 0題解:

問題轉化為分別求lcp>=r的字尾的組數

算是道思維題吧,關鍵需要明白lcp為l的一組 對後面的l-1 l-2 l-3....也可以貢獻

那麼就出現了正解,要不然就只能 n^2logn亂搞了

顯然 按上面得出的結論 可以從大到小排序high陣列,然後分別處理,一組lcp為l的字尾顯然和大於l字尾匹配

所以合併答案直接相乘即可,合併可以並查集亂搞

1 #include 2 #include 3 #include 4 #include 5 #include 6

using

namespace

std;

7 typedef long

long

ll;8

const

int n=300005;const ll inf=2e18;

9char s[n];int

n,c[n],x[n],y[n],s[n],a[n],sa[n],rk[n],high[n];

10bool comp(int i,int j,int k)

11void

getsa()30}

31void

getheight()40}

41 ll mx[n],mn[n],ans[n],size[n],mul[n];int

r[n],fa[n];

42int find(int x)

43bool comper(int i,int j)

44void

getanswer()

56for(int i=n-1;i>=0;i--)ans[i]+=ans[i+1],mul[i]=max(mul[i],mul[i+1

]);57

for(int i=0;i"

%lld %lld\n

",ans[i],ans[i]?mul[i]:0

);58}59

intmain()

60

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,每個標...