GDOI2017 微信 廣義SAM 狀態壓縮

2022-03-29 04:37:52 字數 1117 閱讀 5259

題面過長,略

先把n個串合併建出trie. 由於n很小,對於trie的每個節點,我們用狀壓記錄這個節點代表的子串來自哪些串。然後bfs這個trie,建出廣義sam.對於sam中新建的每個節點,同樣維護這個子串來自哪些串,構建的時候把它賦值為原trie上的狀態(複製出來的節點為0).然後在parent樹上,把子樹中的狀態並上來。

接著設\(f[s]\)表示詢問的串狀態為\(s\)的答案。設字尾自動機上每個點的狀態為\(s_x\),我們初始化\(f[s_x]=len(x)\).那麼由於x代表在\(s_x\)中的每個串都存在,那麼在\(s_x\)的子集中的每個串都存在。我們可以用\(f[s_x]\)去更新\(f[s_x-\]\),即:

\[f[s-\]=\min(f[s-\],f[s])

\]對於詢問,直接輸出對應的\(f\)即可。時間複雜度\(o(\sum |s|+2^n)\)

#include#include#include#include#define maxn 2000000

#define maxc 26

#define maxs (1<<20)

using namespace std;

int n,m;

char in[maxn+5];

struct exsam t[maxn*2+5];

const int root=1;

int ptr=1;

int extend(int last,int c,int sta)

if(p==0) link(cur)=root;

else

}}t1;

struct trie

} }void build(exsam &t1)

int main()

t2.build(t1);

t1.topo_sort();

for(int i=1;i<=t1.ptr;i++) dp[t1.t[i].sta]=max(dp[t1.t[i].sta],t1.t[i].len);

for(int i=(1<=0;i--)

} scanf("%d",&m);

for(int i=1;i<=m;i++)}/*

2abaac2

01 */

GDOI2017模擬8 12 躲藏

給出乙個n m的網格圖,圖中有一些障礙節點。現在有a個男生和b個女生,還有乙個小標。男生要和女生配對,小標可以和任何乙個人配對。每一對cp 霧 只能待在乙個點。乙個點只能有一對cp。現在給出a b 1個人的初始座標,和他們的移動速度 即移動到4相鄰格仔所需的時間 所有人同時移動,求完成配對的最小時間...

GDOI2017模擬8 12 新車

平面上有乙個數軸,e點為目標點。你現在要開 車從w前往e,每移動1格需要1l油。你的油箱容量為s,初始時裝滿了98 汽油。數軸上有n個加油站,每個加油站提供98 95 92 中的一種。到了加油站你可以選擇加任意數量的油,你的油箱是茲瓷所有油甚至混合油的。你認為98 最吼,95 其次,92 跑的最慢。...

GDOI2017模擬11 5 總結

看到第一題,哇,數論題,不會啊,感覺要跪 正當我迷茫的時候,突然機房斷電了。啪的一聲大家的電腦都黑了!不知所措!沒辦法,只好等等。過了10分鐘左右,來電了,重新看了看第一題,也許是冷靜下來了,發現直接暴力分解質因數就能過!繼續看第二題,在草稿紙上推了一下,要用揹包,一開始以為會超時,但仔細想了想發現...