HAOI2016 找相同子串

2022-05-12 19:12:55 字數 1998 閱讀 5240

這題感覺有點坑啊。

題目還是不難想的,先對乙個字串建字尾自動機,然後拿另乙個字串在上面跑。

假設當前跑到了p點,匹配長度為len。

那麼當前會對答案產生貢獻的串是哪些呢?

顯然當前會對p及p到根的鏈產生貢獻。

這樣顯然可以用樹形dp優化。

同時需要差分(我也不知道這是否是必須的)。

下面有update。

#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define mem1(i,j) memset(i,j,sizeof(i))

#define mem2(i,j) memcpy(i,j,sizeof(i))

#define ll long long

#define up(i,j,n) for(int i=(j);i<=(n);i++)

#define file "dealing"

#define poi vec

#define eps 1e-10

#define db double

const int maxn=401000,inf=1000000000,mod=1000000007;

int read()

while(ch<='9'&&ch>='0')

return f*x;

}bool cmax(int& a,int b)

struct sam

int extend(int x)

} }int getsort()

int walkprepare()

int walk(int x)

int build(char* s)

}a;char s[maxn];

ll ans[maxn],w[maxn],e[maxn];

int main()

for(int i=a.cnt;i>=1;i--)

ll sum=0;

for(int i=a.cnt;i>=1;i--)ans[i]+=ans[i+1],sum+=ans[i];

cout發現自己的做法麻煩了,我們又不用求長度為i的子串的方案,ans完全可以省略,直接預處理到這個節點的方案數,最後加上去即可。

code:修改版本

#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define mem1(i,j) memset(i,j,sizeof(i))

#define mem2(i,j) memcpy(i,j,sizeof(i))

#define ll long long

#define up(i,j,n) for(int i=(j);i<=(n);i++)

#define file "find_2016"

#define poi vec

#define eps 1e-10

#define db double

const int maxn=401000,inf=1000000000,mod=1000000007;

int read()

while(ch<='9'&&ch>='0')

return f*x;

}bool cmax(int& a,int b)

struct sam

int extend(int x)

} }int getsort()

int walkprepare()

int walk(int x)

int build(char* s)

}a;char s[maxn];

ll ans=0;

int main()

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...