#include
#include
#include
using
namespace
std;
const
intmaxn =
10005;
intf[
maxn];
void
getf1(
string
p)//可判斷週期及迴圈數
f[i +
1] = p[
i] == p[
j] ? j + 1:
0; }
for(int
i =
1; i <= p.
size
(); i ++) }
cout
<<
endl;
}//getf1()
void
match1(
string
t,stringp)
if(t[i
] == p[
j]) if
(j == p.
size
()) }
}//match1()
void
getf3(
string
p)//據說省時
else
f[i] = j; }
else
j =
f[j]; }
}//getf3()
void
match3(
string
t,stringp)
else
j =
f[j]; if
(j == p.
size
())
} }
//match23()
intmain()
kmp就像dfs,只是方法,題意變化,需要技巧轉化。
poj1961
求給定字串s,前i個字元,是否存在是字串t的迴圈,迴圈次數k>1。求每種t的長度和k。
先求失配陣列f。若i失配,則回到f[i],則s[f[i]..i]是s[1..i]的某個字首,s[1..i]可能存在長度為(i - f[i])的字串迴圈。
(i - f[i]) * k = i得到i % (i - f[i]) = 0。
且k > 1,即f[i] > 0。
poj2752
給定字串s,求所有字串a,為s的字首字尾。即求所有k,使s[1..k] = s[sz - k + 1..sz]
失配陣列f.
q1 = f[sz],即s[1..q1] 與s[1..sz]最後q1個字元相同
q2 = f[q1],即s[1..q2] 與s[1..q1]最後q2個字元相同,即s[1..q2]與s[1..sz]最後q2個字元相同,即s[1..q2]同時為s的字首字尾。
以此類推,至q = f[qx] = 0,沒有乙個字元相同,退出。
kmp字串匹配
首先要對模式串進行預處理。預處理過程就是計算出指定位置的字首和字尾的最大相同的長度 啊啊啊啊。估計只有我乙個人能看懂 這個文章說得很清楚 比如說 a a a c b c a a a 0 1 2 0 0 0 1 2 3 void getnext int next,char par 20 int n 翻...
字串匹配 KMP
參考 從頭到尾徹底理解kmp 在字串 str 中 匹配模式串 pattern 1.計算模式串的 next 陣列 2.在字串中匹配模式串 當乙個字元匹配時,str i pattern k 繼續匹配下乙個字元 當當前字元不匹配時,根據 next 陣列移動模式字串,k next k next 陣列 描述模...
KMP字串匹配
判斷s中是否含有字串t。一般思路為 從s中首字元開始,依次與t中進行比對,直到t結尾或者某乙個位置兩者不同 如果到t的結尾,則表示s中含有t。如果有乙個位置不相同,那麼從s中下乙個字元開始,再次與t中字元比對。如下 i 0,j 0 for i len 這樣的比較,每一次遇到不同的時候都需要從t串的第...