1. 程式人生 > >集訓 0619

集訓 0619

的人 去重 splay 給定 nbsp i++ gif all isp

T1:

一道字符串題目,給定一個字符串集合,求有多少個字符串可以被表示成A前綴+B前綴的形式。

關鍵在於去重。定義合法狀態上加上一維表示B的前綴不能可以切掉接到A的後面去。

那麽問題轉化成有多少個子串滿足前綴可以被接到另外的字符串後面,且切掉這個前綴後剩下的後綴同樣是Trie樹上的前綴。

那麽,考慮一下如何求這玩意,

前綴可以被接到另外的字符串後面,意味著這在FAIL樹上它是那些字符串的前綴,可以利用FAIL樹的siz域求。

考慮剩下的後綴同樣是Trie上的前綴,那麽意味著從這個點往上跳FAIL樹可以跳到這個後綴字符串。

再考慮發現若一個前綴被重復接上了,那麽只要最小的前綴可以接上,較大的前綴也可以。(總感覺有歧義)。

那麽只需要統計最小的前綴FAIL樹上的siz域-1即可。

具體的實現就是

技術分享
1 int id[maxn];
2 void DFS(int x){
3     id[len[x]]=x;
4     if(f[x])ans-=siz[id[len[x]-len[f[x]]]]-1;
5     for(int i=0;i<26;i++)
6         if(c[x][i])DFS(c[x][i]);
7 }
View Code

了解我的人應該都知道是什麽意思吧.....應該吧。

T2:

一種很妙但沒有什麽拓展性的DP做法和一個很難寫但拓展性較強的點分做法。

嗯,我再看看...

T3:

HALL定理,我要看看。

集訓 0619