ZJOI2015 諸神眷顧的幻想鄉

2022-02-05 15:12:42 字數 2789 閱讀 4679

求不同的子串個數

如果規定根的話,那麼彎曲的路徑難以處理。

由於只有20個葉子,所以以每個葉子分別為根,建20棵trie樹,再把20棵trie樹合成一棵。

這樣,trie上乙個到某個祖先的路徑構成了所有的子串。(可能重複)

所以trie上建sam。sam的路徑條數(或者每個點的len[i]-len[fa[i]])就是本質不同的子串個數

至於trie上建sam,可以dfs,或者bfs建。

只要記錄樹上x的father的sam上的節點編號p,從這個p作為nd開始建即可。

#include#define il inline

#define reg register int

#define numb (ch^'0')

using

namespace

std;

typedef

long

long

ll;il

void rd(int &x)

namespace

miraclee[

2*n];

inthd[n],cnt;

void add(int x,int

y)struct

trie

}tr;

void dfs(int x,int y,int

fa) y=tr.ch[y][clo[x]];

for(reg i=hd[x];i;i=e[i].nxt)

}struct

sam

int ins(int c,int

p)

int q=ch[p][c];

if(len[q]==len[p]+1

) len[++cnt]=len[p]+1

; fa[cnt]=fa[q];fa[q]=fa[np]=cnt;

for(reg i=0;ich[q][i];

while(p&&ch[p][c]==q) ch[p][c]=cnt,p=fa[p];

return

np; }

ll dfs(

intx)

}return

s[x];

}}sam;

int pos[20*n];

void build(int

x) }

}int

main()

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

}//cout<

; build(1);

printf(

"%lld\n

",sam.dfs(1)-1

);

return0;

}}signed main()

/*author: *miracle*

date: 2018/12/12 11:22:24

*/

1其實不用建出合併的trie。

直接在20次dfs的時候(每次dfs都是乙個小trie),20次每次從根開始插入即可。

重複的字首部分會和根節點隔離開的。既不會能從根節點到達,而且fa[i]=len[i],沒有包含乙個子串。

#include#define il inline

#define reg register int

#define numb (ch^'0')

using

namespace

std;

typedef

long

long

ll;il

void rd(int &x)

namespace

miraclee[

2*n];

inthd[n],cnt;

intn,m;

intclo[n];

void add(int x,int

y)struct

sam

int ins(int c,int

p)

int q=ch[p][c];

if(len[q]==len[p]+1

) len[++cnt]=len[p]+1

; fa[cnt]=fa[q];fa[q]=fa[np]=cnt;

for(reg i=0;ich[q][i];

while(p&&ch[p][c]==q) ch[p][c]=cnt,p=fa[p];

return

np; }

ll dfs(

intx)

}return

s[x];

}}sam;

intdu[n];

void dfs(int x,int fa,intp)}

intmain()

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

//cout

%lld

",sam.dfs(1)-1

);

return0;

} }signed main()

/*author: *miracle*

date: 2018/12/12 15:07:01

*/

2(當然,如果廣義sam要處理right集合的大小的話,要根據建造的方法處理

1.所有的串依次從rt=1開始插入

葉子sz賦值為1,然後parent樹上往上push。注意,不管節點是否有實際意義,都要push上去。因為代表乙個出現的位置

2.trie樹

先要找到trie樹某個點的sz[x],然後插入的時候sz就是這個sz[x]

ZJOI2015 諸神眷顧的幻想鄉

p3256 zjoi2015 day1 諸神眷顧的幻想鄉 時間限制 20000 ms 空間限制 524288 kb 問題描述 幽香是全幻想鄉里最受人歡迎的萌妹子,這天,是幽香的2600歲生日,無數幽香的粉絲到了幽香家門前的太陽花田上來為幽香慶祝生日。粉絲們非常熱情,自發組織表演了一系列節目給幽香看。...

ZJOI2015 諸神眷顧的幻想鄉

一行乙個整數表示答案 7 3 0 2 1 2 1 0 0 1 2 3 4 3 5 4 6 5 7 2 5n 100000,c 10 發現葉子只有10個,那麼可以以每個葉子為根,建trie,然後建廣義字尾自動機 對於每個狀態,代表的字串個數就是max min 1 include include inc...

ZJOI2015 諸神眷顧的幻想鄉

給定一棵葉子節點不超過 20 個的無根樹,每個節點上都有乙個 0 sim 9 的數字,求樹上本質不同路徑條數。兩條路徑相同是指其路徑上所以節點上的數字順次鏈結組成的字串相同。1 le n le 10 5 如果此題是從根出發的路徑,那相當於就是給定了一棵 text 樹,非常好做。考慮轉化成從根開始的路...