4 2 省選模擬賽 旅行路線 廣義SAM

2022-02-05 02:00:27 字數 1180 閱讀 5506

題目上求出 多少條本質不同的路線。

首先定義了 相似的城市為度數相同的城市。

還定義了兩條路線相同當且僅當長度相同 且對應位置的城市都是相似的。

考慮這張圖的形態 n-1條邊 且每個點都能到1號點。

不可能出現環 因為 考慮如果出現環必然 x個點 x條邊 根據鴿巢原理 乙個點被孤立了 所以這是一棵內向樹。

暴力顯然是把所有長度相同的路線給拿出來然後去重比對。

如何去重 我們考慮把度數相同的點就定義為其度數大小 然後很容易利用hash或者暴力進行比對。

進一步的 發現這類似於字串。

可以發現 整棵樹是乙個字典樹。問題是 求出本質不同的 子串個數

建立廣義sam.沒了。

考慮 字符集1e5 開map 沒了...

題解中給了另外一種做法 考慮利用樹上sa來求。

發現樹上字尾排列不易。最後統計答案也是兩個相鄰排名的串統計的。

考慮列舉兩個相鄰排名的串 然後統計一下lcp即可。

lcp可以hash+倍增做 題解中是倍增做了一發sa我不太明白 它是咋做的。

const int maxn=200010;

int n,cnt=1,len1;ll ans;

int a[maxn],len[maxn],f[maxn];

int lin[maxn],ver[maxn],nex[maxn];

mapt[maxn];

inline void add(int x,int y)

inline int insert(int x,int last)

return nq;

} int np=last=++cnt;

len[np]=len[p]+1;

while(p&&t[p][x]==0)

if(!p)f[np]=1;

else

}} ans+=len[np]-len[f[np]];

return last;

}inline void dfs(int x,int v)

int main()

dfs(1,1);putl(ans);return 0;

}

省選模擬42

首先可以猜出來每種鈔票的貢獻是獨立的,所以只要對於每種鈔票算出來貢獻最後合併就行了。直接做複雜度會死掉。考慮對於每種鈔票,張數隨貢獻的差分陣列顯然是單調的,所以可以用堆動態維護當前的最優解。發現最多隻會用到 n 種狀態,所以動態的計算這些狀態,而不必全部預處理出來。我的做法是,求出來至少有k條邊與原...

省選模擬42 題解

容易發現每種假鈔的期望貢獻是獨立的。對於每種假鈔,做乙個 n 2 的 dp 求出來選擇 i 張假鈔的貢獻。然後對這個貢獻做乙個揹包就完事了。考慮乙個東西,就是對於每種假鈔,只能選擇乙個數目加入揹包的貢獻中。所以可以考慮對於每種假鈔一張張加入貢獻。然後發現發現隨著某種假鈔的數量增加,期望增加量是不斷減...

6701 2020 06 07省選模擬 旅行

給出乙個含有若干個不相交矩形的平面直角座標系,以及起點和終點。從起點到終點的路途中,不能經過矩形,但是可以在矩形邊經過。求最短的曼哈頓距離。n 2 e5 n leq 2e5 n 2e5 比賽時認為是歐幾里得距離,所以不存在思考 先說dyp的做法 對於乙個點,找到上下左右第乙個碰到的邊界,然後可以形成...