ACM常用模板 擴充套件KMP

2021-07-07 06:01:37 字數 4278 閱讀 9064

模板:擴充套件kmp,用extend[i]儲存 主串 s[i.....n-1]與 模式串 t的最長公共字首的長度

using

namespace

std;

intne[

maxn

],extend

[maxn

];

void

ekmp

(chars,

chart)

//s為主串,t為模版串

}

j=0

;

while(j

<

len1&&j

<

len&&s[

j]==t[

j])j++;

extend[0

]=j;

a=0

;

for(i=

1;i<

len1;i

++)

}

}

int

main

().

return

0;

}

const

intmaxn

=100010

;//字串長度最大值

int

next

[maxn

],ex

[maxn

];//ex陣列即為extend陣列

//預處理計算next陣列

void

getnext

(char

*str

)

}

}

//計算extend陣列

void

exkmp

(char*s1

,char*s2

)

}

}

hdu4333

給乙個數字字串s,  可以把s最後乙個數字移動到最前面變成另乙個數字。例如123,  經過移動依次變成312,231,123。 注意當移動次數正好和s長度相等時,s又變回了最開始的那個數字。

求這個移動過程所形成的所有字串,大於s(最初的)的數字,等於s,以及小於s的各有多少個。

擴充套件kmp能求出乙個串所有字尾串(即s[i...len])和模式串的最長公共字首。於是只要將這個串複製一遍,求出該串每個字尾與其本身的最長公共字首即可,當公共字首》=len時,顯然相等,否則只要比較下一位就能確定這個串與原串的大小關係。

至於重複串的問題,只有當這個串有迴圈節的時候才會產生重複串,用kmp的next陣列求出最小迴圈節,用長度除以最小迴圈節得到迴圈節個數,在將3個答案都除以迴圈節個數即可。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define

maxn

100005

#define

ll long

long

#definems(

a,b)

memset(a

,b,sizeof(a

))

#definefi(

a,b)

fill(a

,a+maxn,b

)

#definesf(

n)scanf

("%d",&n

)

#define

sf2(a,

b)scanf

("%d%d",&a

,&b)

#definepf(

n)printf

("%d\n",n

)

#define

ffr(i,

n)for(i=

0;ii++)

/*

s:abcdabcadcabcdcab

p: abcdcab

next:-1000001

*/

using

namespace

std;

intne[

maxn

],extend

[maxn],m

,l,r

,knext

[maxn

];

void

ekmp

(chars,

chart)

//s為主串,t為模版串

}

j=0

;

while(j

<

len1&&j

<

len&&s[

j]==t[

j])j++;

extend[0

]=j;

a=0

;

for(i=

1;i<

len1;i

++)

}

}

void

getnxt

(char*s

)else

}

}

int

main

()

getnxt(b

);

intqt=1

;

intt

=len

-knext

[len

];

if(

len%t==

0)

printf

("case %d: %d %d %d\n"

,case

++,l/qt

,m/qt

,r/qt

);

}

return

0;

}

擴充套件kmp模板

擴充套件kmp詳解 擴充套件 kmp 演算法 輔助陣列next i 表示t i,m 1 和t的最長公共字首長度 設定兩個變數,a 和 p。p 代表以 a 為起始位置的字元匹配成功的最右邊界,也就是 p 最後乙個匹配成功位置 1 模板 p5410 模板 擴充套件 kmp 例題 hdu 4333 rev...

擴充套件KMP模板

具體原理可以參考這裡 擴充套件kmp 擴充套件kmp演算法 劉毅 1 include2 include3 include4 include5 using namespace std 6const int n 1e6 5 7 8int len1,len2 9int nxt n extend n nxt...

擴充套件KMP模板(學習)

乙個算是冷門的演算法 在競賽上 不過其演算法思想值得深究。kmp的演算法思想,具體可以參考這篇 trie樹 字典樹 擴充套件kmp的模板問題 給你兩個字串s,t,長度分別為n,m。請輸出s的每乙個字尾與t的最長公共字首。雜湊是不可能的,這輩子都不可能的。mathcalac自動機?好像更不可做了。我們...