HDU和PKU的一些KMP題

2021-06-28 09:43:14 字數 2034 閱讀 9395

如果看了我部落格介紹還沒懂kmp,則下面鏈結拿好。

超好的kmp詳解

kmp詳解2

鏈結一鏈結二 

擴充套件kmp

劉雅瓊ppt

擴充套件kmp 鏈結二

hdu 2087 剪花布條 求匹配次數(不可重疊)

#include #include #include #include #include using namespace std;

const int maxn = 1000 + 5;

int nxt[maxn];

void getnext(string s)

else j = nxt[j];

}}int kmp(string s1, string s2)

}return cnt;

}int main()

return 0;

}

poj 3461 oulipo

求匹配的次數(可重疊),跟上面的區別就是匹配成功後跳到 next[j] 而非0

#include #include #include #include #include #include using namespace std;

#define re freopen("in.txt","r",stdin);

const int maxn = 1e5 + 5;

const int inf = 0x3f3f3f3f;

int nxt[maxn];

void getnext(string s)

}int kmp(string s1, string s2)

}return cnt;

}int main()

return 0;

}

hdu 2594 simpsons』 hidden talents

題意:給定字串s1和s2,求s1的最長字首s,這個s是s2的字尾

思路:將s1和s2連起來,且用不會出現的字元隔開,得到長度為n的新串,求新串kmp裡的next陣列,答案就是next[n] 

next[i]代表了以s[i-1]為結尾的滿足字首串和字尾串相同的最長字串的長度(如acbacb: 最後個b下標為5,則next[5]=2,因為最前面有ac,b的前2個也是ac)

之所以要隔開,是防止next的值大於min(s1長度,s2長度),求得的s長度肯定最多是min(s1長度,s2長度)【如s1=aaa,s2=aaa】

#include #include #include #include #include #include #include #include #include using namespace std;

#define ll long long

#define eps 10^(-6)

#define q_cin ios::sync_with_stdio(false)

#define rep( i , n ) for ( int i = 0 ; i < n ; ++ i )

#define for( i , a , b ) for ( int i = a ; i <= b ; ++ i )

#define clr( a , x ) memset ( a , x , sizeof (a) )

#define re freopen("1.in","r",stdin);

#define we freopen("1.out","w",stdout);

#define mod 10009

#define nmax 10002

#define min(a,b) ((a)>(b)?(b):(a))

#define max(a,b) ((a)<(b)?(b):(a))

int next[50005<<1];

void get_next(string s1)

else

k = next[k];

}}int main()

return 0;

}

字串KMP 一些題

利用失配陣列nxt 最長的乙個 前字尾 是1 nxt n 那麼下乙個是多少?includeusing namespace std define rg register const int n 1000000 5,m 10000 5,inf 0x3f3f3f3f,p 99999997 int l,j,...

一些擴充套件kmp的總結

花了一天多時間學了下ex kmp。可以看劉雅瓊的 ppt,講的非常清楚 我的寫法是 next i p i.m 1 與 p 0.m 1 的最長公共字首 ex i t i.n 1 與 p 0.m 1 的最長公共字首 我的小模板 html view plain copy 擴充套件kmp next i p ...

KMP中的一些技巧( )

以下是我看的描述最小迴圈節能讓我看懂的一篇部落格 先簡單介紹一下kmp演算法利用 nxt 陣列求最小迴圈節的原理 假設圖中的黑色是原來的字串,現在要求最小迴圈節,對於nxt len 來說指的是圖中藍色和黃色的長度,而且藍色和黃色是相等的,那麼綠色和紫色也是相等的,對比原串可知紫色跟粉色是相同的子串,...