日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ 4516 [Sdoi2016] 生成魔咒

發(fā)布時間:2024/4/17 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ 4516 [Sdoi2016] 生成魔咒 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

傳送門

心態(tài)崩了++

后綴自動機板子題[考場上要是不會后綴自動機就崩了T^T]

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

根據(jù)SPOJ7258我們可以得到 本質(zhì)不同的子串數(shù)量可以通過建出自動機 樹形dp解決

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

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

直接求一下就好了

另外的理解方式就是我們要求本質(zhì)不同的前綴數(shù)量 那么就是parent樹上len的定義 直接len[x]-len[fa]就是答案

時間復(fù)雜度O(n)

寫完了調(diào)過樣例交了一發(fā)WA 然后看到STD里開longlong了改了一發(fā)longlong又一發(fā)WA 然后心態(tài)崩掉 一點一點重推 最后發(fā)現(xiàn) 我輸出沒改 還是%d [手動再見]

附代碼。

#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<map> #define inf 20021225 #define ll long long #define mxn 100010 using namespace std; struct node{int fa,len;map<int,int> ch;}t[mxn*4]; int poi,lt,rt,n;ll ans; void insert(int c) {int p=lt,np=lt=++poi; t[np].len=t[p].len+1;for(;p&&!t[p].ch[c];p=t[p].fa) t[p].ch[c]=np;ans+=t[np].len;if(!p){t[np].fa=rt;return;}int q=t[p].ch[c];if(t[q].len==t[p].len+1){ans-=t[q].len;t[np].fa=q;return;}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() {int x;scanf("%d",&n);lt=rt=++poi;for(int i=1;i<=n;i++){scanf("%d",&x);insert(x);printf("%lld\n",ans);}return 0; }

本題還有一個非常優(yōu)秀的做法就是SA

我們發(fā)現(xiàn) 要求本質(zhì)不同的前綴數(shù)量 那么就是 len - max_lcp 我們發(fā)現(xiàn) 這個不就是SA的height嗎!

我們可以通過倒過來刪除的操作 鏈表維護一通 也是可以AC的~

時間復(fù)雜度是O(nlgn) 瓶頸在于求SA 如果你是大佬寫DC3的話請無視

我這輩子也不可能寫DC3的[Flag]

轉(zhuǎn)載于:https://www.cnblogs.com/hanyuweining/p/10321915.html

總結(jié)

以上是生活随笔為你收集整理的BZOJ 4516 [Sdoi2016] 生成魔咒的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。