hdu6153 A Secret 擴充套件kmp

2021-10-03 18:24:25 字數 1160 閱讀 4905

題意:給兩個字串s和t,求t的每個字尾的長度乘以它在s**現的次數之和。

用了擴充套件kmp的板子,因為擴充套件kmp求出的extend[i]extend[i]表示的是ss的ii到strlen(s)−1strlen(s)−1字元和tt的最長公共字首。題目中要求字尾,就將兩個字串reverse一下。這樣的話,extend[i]extend[i]就變成了ss的前strlen(s)−istrlen(s)−i個字元和tt的最大公共字尾的長度。如果發現最大字尾長度為22的話,那麼字尾長度為11的情況一定也出現了

#include

using

namespace std;

#define ll long long

const

int maxn=

1e6+5;

int nex[maxn]

;int extend[maxn]

;char q[maxn]

;char w[maxn]

;const ll mod=

1000000007

;///用int會wa

void

get_next

(char str)

nex[1]

=i; p=1;

for(

int i=

2;i)else

nex[i]

=j; p=i;}}

}void

extendkmp

(char s1,

char s2)

extend[0]

=i; p=0;

for(i=

1;i)else

extend[i]

=j; p=i;}}

}///extend[i]:y[i...n-1]與x[0...m-1]的最長公共字首

intmain()

ans+

=(extend[i]

%mod)*(

(extend[i]+1

)%mod)/2

;///等差數列的運用(求1~n的前n項和)。

ans%

=mod;}}

printf

("%lld\n"

,ans);}

}

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求出最長...