HDU 6153 A Secret 擴充套件KMP

2021-09-27 11:42:57 字數 977 閱讀 5701

題意

在母串中找模式串的所有字尾的匹配次數,並乘上各種字尾對應長度,再把所有的結果加起來%1e9+7輸出。

思路:把兩個字串都反轉一下就變成了字首匹配,就可以利用擴充套件kmp的性質了。因為extend[i] 表示的是從i到結尾的主串與模式串的最長公共字首,這樣遍歷一遍主串,每一位對答案的貢獻就是1+⋯+extend[i]=extend[i]×(extend[i]+1)/2,累加即可。

舉個栗子 (下面是反轉後的字串)

s串: abbabbab

t串: abbc

extend[3]=3,那麼長度為1,2,3的「a」,「ab」,"abb"各匹配一次,貢獻為(1+2+3),即(1+2+…+extend[i]),即(extend[i]*(extend[i]+1))/2。

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define inf 0x3f3f3f3f

using

namespace std;

const

int maxn=

1e6+5;

const

int mod=

1e9+7;

int nex[maxn]

;int extend[maxn]

;void

pre_exkmp

(char

*b)}

}void

exkmp

(char

*a,char

*b)}

}char a[maxn]

;char b[maxn]

;int

main()

return0;

}

HDU 6153 A Secret 擴充套件KMP

題目鏈結 給定兩個串,求其中乙個串s的每個字尾在另乙個串t中出現的次數乘以其長度之和。擴充套件kmp模板題,將s和t串都逆序以後就變成了求字首的問題了,擴充套件kmp求處從i位置開始的最長公共字首存於陣列,最後通過將陣列的值不為0的進行乙個等差數列和的和就可以了。include include in...

HDU6153 A Secret 擴充套件KMP

記錄乙個菜逼的成長。題目鏈結 給你乙個字串 s 乙個字串p.問p的所有字尾字串在 s中出現的次數乘上相應字尾字串的長度的和 sample input abababab aba suffix s2,1 aba suffix s2,2 ba suffix s2,3 a n1 3,n2 3,n3 4.l1...

HDU 6153 A Secret 擴充套件kmp

題意 對於s2的每乙個字尾,假設長度為l,在s1出現的次數為k,求l k的和 題解 我們把兩個串都倒過來,變為s1,s2,那麼問題就變為,對於s2的字首匹配s1的每個位置的字尾的總匹配長度和,舉個栗子,s1 aaa s2 aa 那麼在s1的位置1,能匹配的長度有1 2,因此我們擴充套件kmp求出最長...