NOI2015 品酒大會 字尾自動機

2022-06-29 22:51:12 字數 1568 閱讀 9330

建出sam和字尾樹

兩個子串的最長lcp就是他們的lca

因此我們只需求出最長的個數然後用字首和就能算出總個數,最大值也是同樣的方法, 當然要逆序建sam才能保證他們的第一位相同。

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

#define ll long long67

using

namespace

std;89

inline ll read()

1016 ch =getchar();17}

18while(ch >= '

0' && ch <= '9'

) 22

return x *w;23}

2425

const

int maxn = 1e6 + 10;26

27int

head[maxn];

28char

s[maxn];

29ll d[maxn];

30ll ans[maxn], num[maxn];

31ll fi, se;

32int

flag[maxn];

33ll size[maxn];

34ll maxn[maxn], minn[maxn];

35int

len;

36int lst = 1, tot = 1;37

38struct

sam t[maxn];

4243

void extend(int x, int

d)44

54if(!last) else

else71}

72}73}

7475

int cnt = 0;76

77struct

edge g[maxn];

8081

void addedge(int u, int

v)82

8788

bool ok(int

x)89

9293

void dfs(int

x)94

103 maxn[x] =max(maxn[x], maxn[to]);

104 minn[x] =min(minn[x], minn[to]);

105}

106}

107108

intmain()

109123

for(int i = 0; i <= len; i++)

126for(int i = len; i >= 1; i--)

129for(int i = 2; i <= tot; i++)

132 dfs(1

);133

for(int i = len - 1; i >= 0; i--)

137for(int i = 0; i < len; i++) else

143}

144return0;

145 }

view code

NOI 2015 品酒大會 字尾陣列

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

NOI2015 品酒大會(字尾樹 DP)

字尾自動機有乙個性質。就是如果倒建sam兩個串的lcp就是這兩個串的結束節點的lca。然後就可以愉快的跑dp了。對於每乙個字尾樹上的節點 u 它對 len u 的貢獻是 sum sum size v1 size v2 當然如果u就是乙個字尾的結尾就要加上自己。然後最大值怎麼辦?我們在每乙個節點上維護...

Noi 2015 品酒大會

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