BZOJ 4516 Sdoi2016 生成魔咒

2022-05-25 11:18:12 字數 1131 閱讀 4627

心態崩了++

字尾自動機板子題[考場上要是不會字尾自動機就崩了t^t]

可以看出 每次答案的貢獻就是和原來本質不同的子串數量

根據spoj7258我們可以得到 本質不同的子串數量可以通過建出自動機 樹形dp解決

我們需要知道的就是 連向它的那個鏈

就是我們建立自動機的時候的那個找的p

直接求一下就好了

另外的理解方式就是我們要求本質不同的字首數量 那麼就是parent樹上len的定義 直接len[x]-len[fa]就是答案

時間複雜度o(n)

寫完了調過樣例交了一發wa 然後看到std裡開longlong了改了一發longlong又一發wa 然後心態崩掉 一點一點重推 最後發現 我輸出沒改 還是%d [手動再見]

附**。

#include#include#include#include#include#define inf 20021225

#define ll long long

#define mxn 100010

using namespace std;

struct nodet[mxn*4];

int poi,lt,rt,n;ll ans;

void insert(int c)

int q=t[p].ch[c];

if(t[q].len==t[p].len+1)

int nq=++poi; t[nq].len=t[p].len+1;

t[nq].ch=t[q].ch; ans-=t[nq].len;

t[nq].fa=t[q].fa; t[q].fa=t[np].fa=nq;

for(;p&&t[p].ch[c]==q;p=t[p].fa) t[p].ch[c]=nq;

}int main()

return 0;

}

本題還有乙個非常優秀的做法就是sa

我們發現 要求本質不同的字首數量 那麼就是 len - max_lcp 我們發現 這個不就是sa的height嗎!

我們可以通過倒過來刪除的操作 鍊錶維護一通 也是可以ac的~

時間複雜度是o(nlgn) 瓶頸在於求sa 如果你是大佬寫dc3的話請無視

我這輩子也不可能寫dc3的[flag]

bzoj4516 SDOI2016 生成魔咒

time limit 10 sec memory limit 128 mb submit 376 solved 232 submit status discuss 魔咒串由許多魔咒字元組成,魔咒字元可以用數字表示。例如可以將魔咒字元 1 2 拼湊起來形成乙個魔咒串 1,2 乙個魔咒串 s 的非空字串...

bzoj4516 Sdoi2016 生成魔咒

4516 sdoi2016 生成魔咒 time limit 10 sec memory limit 128 mb submit 575 solved 327 submit status discuss 魔咒串由許多魔咒字元組成,魔咒字元可以用數字表示。例如可以將魔咒字元 1 2 拼湊起來形成乙個魔咒...

bzoj 4516 Sdoi2016 生成魔咒

time limit 10 sec memory limit 128 mb submit 1026 solved 576 submit status discuss 魔咒串由許多魔咒字元組成,魔咒字元可以用數字表示。例如可以將魔咒字元 1 2 拼湊起來形成乙個魔咒串 1,2 乙個魔咒串 s 的非空字...