給乙個串建立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...