建出sam和字尾樹
兩個子串的最長lcp就是他們的lca
因此我們只需求出最長的個數然後用字首和就能算出總個數,最大值也是同樣的方法, 當然要逆序建sam才能保證他們的第一位相同。
1 #include 2 #include 3 #include 4 #include 5view code#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 }
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 而乘積最...