HAOI2016 找相同字元 SAM

2021-09-25 06:20:47 字數 1257 閱讀 2342

給乙個串建立sam,另乙個在sam上跑匹配,同時計算當前匹配串的所有字尾所產生的的貢獻。

由於sam上乙個節點可能不包含所有字尾,要把fat

he

rfather

father

的貢獻下放到son

sonso

n。//詳情見**

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

#define sf scanf

#define pf printf

#define ll long long

const

int n=

1e6+10;

map <

int,

int> ch[n]

;int fa[n]

,las,tot,d[n]

,g[n]

,n,k;

ll len[n]

,cnt[n]

,f[n]

;inline

void

init()

inline

void

add(

int c)

if(len[p]+1

==len[q]

)int clo=

++tot;

fa[clo]

=fa[q]

;fa[q]

=fa[cur]

=clo;

ch[clo]

=ch[q]

;len[clo]

=len[p]+1

;for

(;p&&ch[p]

[c]==q;p=fa[p]

)ch[p]

[c]=clo;

}inline

void

get(

)char s[n]

;signed

main()

p=ch[p]

[c];

++l;

ans+

=f[p]

+cnt[p]

*(l-len[fa[p]])

;}cout

}

HAOI2016 找相同字元

給定兩個字串,求出在兩個字串中各取出乙個子串使得這兩個子串相同的方案數。兩個方案不同當且僅當這兩個子串中有乙個位置不同。兩行,兩個字串s1,s2,長度分別為n1,n2。1 n1,n2 200000,字串中只有小寫字母 題解 s1 s2拼起來。求height 要求 i j lcp rk i rk j ...

HAOI2016 找相同字元

其實這道題跟 ahoi2013 差異很像 其實這個問題的本質就是讓你算所有字尾的 lcp 長度之和,但是得來自兩個不同的字串 先把兩個字串拼起來做一遍 sa 由於我們多算了來自於同乙個串內的情況 於是在分別對這兩個串建 sa 減掉這兩次算出來的答案 現在的問題轉化為求出 height 陣列所有子區間...

HAOI 2016 找相同字元

題目鏈結 演算法 首先 子串是字尾的字首 考慮拼接兩個字串 中間用不可見字元隔開 求出該字串的字尾陣列 那麼字首相同的字尾一定排名一定接近 而我們又知道lcp i j min 維護乙個單調遞增的字尾陣列即可 時間複雜度 o nlogn n a b includeusing namespace std...