hdu 6153 擴充套件kmp

2021-08-07 07:22:26 字數 1017 閱讀 5695

題意:給定兩個字元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求出最長...