題意:給定兩個字元s1,(length=len1),s2(length=len2);求s2[i->len](i=1,2,3,4,....len),在s1中出現的次數乘上其長度;例如 s1=abababc,s2=abc,則應求abc,bc,c,在s1中出現的次
數。然而擴充套件kmp是求字首的,所以想到將s1,s2反轉一下,即求cba,cb,c,在cbababa中的出現次數答案與不反轉相同(仔細想想就知道),要想求cba,cb,c,在cbababa中的出現
次數,只需求以cbababa為母串,以cba為字串的ex陣列因為 cba包括(cb,c),最後每乙個不為0的ex[i]利用等差數列求和公式算一遍加到ans中(cba出現一次,也就是3*1,
那麼相當於cb出現了一次,即2*1,也相當於c出現一次即1*1,最後總次數加上1+2+3)。
#include #include #include using namespace std;
typedef long long ll;
const long long maxn=1e6+5;
const long long mod=1e9+7;
ll ex[maxn],nex[maxn];
char s1[maxn],s2[maxn];
void get_next(char *str)
{ int len,j,i=0,po;
len=nex[0]=strlen(str);
while (str[i]==str[i+1]&&i+1>t;
while (t--)
{ scanf ("%s%s",s1,s2);
ans=0;
n1=strlen(s1);
n2=strlen(s2);
reverse(s1,s1+n1);
reverse(s2,s2+n2);
memset(nex,0,sizeof(nex));
memset(ex,0,sizeof(ex));
get_extend(s1,s2);
for (int i=0;i
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求出最長...