BZOJ3926 諸神眷顧的幻想鄉(字尾自動機)

2022-03-20 07:13:01 字數 1084 閱讀 1992

bzoj

廣義字尾自動機啦

求多個串的不同子串個數?

當然是字尾自動機,最後只要把\(longest-parent.longest\)求個和就好啦

那麼這題怎麼建字尾自動機

能夠把所有子串都丟進去呢?

當然不用從每乙個節點開始

把樹建出來之後,從每個葉子節點開始遍歷一遍,

同時把遍歷到的點查進\(sam\)就行了

因為每個點的兒子數量最多只有\(20\)

這樣葉子節點的數量就會很少

所以複雜度大概是\(o(nlog)\)級別的

空間複雜度\(o(cnlog)\)級別的

然後就過啦??

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define ll long long

#define rg register

#define max 1000000

inline int read()

int a[max],c,n;

struct sam

t[max<<1];

int tot,last;

void init()

int extend(int c,int p)

}return np;

} ll calc()

}sam;

struct linee[max];

int h[max],cnt=1;

int deg[max];

inline void add(int u,int v);h[u]=cnt++;deg[u]++;}

void build(int u,int ff,int p)

int main()

for(int i=1;i<=n;++i)

if(deg[i]==1)sam.last=1,build(i,0,1);

printf("%lld\n",sam.calc());

return 0;

}

BZOJ 3926 諸神眷顧的幻想鄉

開始看錯題看成了每個點度數不超過20 後來翻了翻題解原來看錯題的不止我乙個 既然葉子數量不超過20,考慮樹上的任何一條路徑,以任何點為根時,如果它不是一條從上到下的路徑,那麼以它的任意一端的子樹內的某乙個葉子為根必然可以變成從上到下的。否則,以它處於下端的點的子樹內的葉子為根也可以做到。所以如果以每...

BZOJ3926 諸神眷顧的幻想鄉

樹上sam!顯然如果樹上一條一條字串放的話那麼是n 2的w 但是 題目的性質非常吼啊!20個葉子節點 我們就可以 把所有葉子結點拎出來當根 全部扔到乙個sam裡 就吼啦 最後的答案是 因為自動機上乙個節點的貢獻就是這麼多啦 自動機啥的 真的好寫呢 flag 機房好冷啊 附 include inclu...

bzoj3926 廣義SAM 諸神眷顧的幻想鄉

description 幽香是全幻想鄉里最受人歡迎的萌妹子,這天,是幽香的2600歲生日,無數幽香的粉絲到了幽香家門前的太陽花田上來為幽香慶祝生日。粉絲們非常熱情,自發組織表演了一系列節目給幽香看。幽香當然也非常高興啦。這時幽香發現了一件非常有趣的事情,太陽花田有n塊空地。在過去,幽香為了方便,在這...