文章**:
假設主串:s: s[1] s[2] s[3] ……s[n]
模式串:t: t[1] t[2] t[3]…..t[m]
現在我們假設主串第i 個字元與模式串的第j(j<=m)個字元『失配』後,主串第i 個字元與模式串的第k(k主串: s[1]...s[i-j+1]...s[i-1]s[i]...
||(匹配) || ≠
模式串: t[1]... t[j-1] t[j]
由此,可以得到關係式如下
t[1]t[2]t[3]...t[j-1] = s[i-j+1]...s[i-1]
由於s[i] != t[j],接下來s[i]將與t[k]繼續比較,則模式串中的前k-1咯字串必須滿足下列關係式,並且不可能存在k'>k滿足下列關係式:
t[1]t[2]t[3]...t[k-1] = s[j-k+1]s[j-k+2]...s[i-1] (k也就是說:
主串: s[1]...s[i-k+1]s[i-k+2]...s[i-1]s[i]...
|| || || ?(待比較)
模式串: t[1] t[2]... t[k-1] t[k]
現在可以把前面的關係綜合總結如下
s[1]...s[i-j+1]...s[i-k+1]s[i-k+2]...s[i-1]s[i]...
|| || || || ≠
t[1]... t[j-k+1] t[j-k+2]... t[j-1] t[j]
|| || || ?
t[1] t[2] ... t[k-1] t[k]
現在唯一的任務就是如何求k了,通過乙個next函式求。
/*
pku3461(oulipo), hdu1711(number sequence)
這個模板 字串是從0開始的
next陣列是從1開始的
*/#include #include using namespace std;
const int n = 1000002;
int next[n];
char s[n], t[n];
int slen, tlen;
void getnext()
/*返回模式串t在主串s中首次出現的位置
返回的位置是從0開始的。
*/int kmp_index()
else
j = next[j];
}if(j == tlen)
return i - tlen;
else
return -1;}/*
返回模式串在主串s中出現的次數
*/int kmp_count()
getnext();
for(i = 0; i < slen; i++)
}return ans;
}int main()
}return ans;
}int main()
return 0;
}
/*
poj 1611 period
sample input
3aaa
12aabaabaabaab
0sample output
test case #1
2 23 3
test case #2
2 26 2
9 312 4
題意就是求乙個字串中的重複子串
*/#include#include#include#includeusing namespace std;
const int maxn=1000010;
char str[maxn];
int next[maxn];
int n;
void getnext()
else k=next[k];
}}int main()
return 0;
}
KMP模板及例題
kmp演算法就是字串匹配演算法,在乙個字串t中查詢字串p的位置。include.h using namespace std const int maxn 1e6 10 int f maxn char t maxn p maxn void getfail void find int main find...
kmp演算法next例題 KMP演算法next陣列求解
kmp演算法與bf演算法的比較 bf演算法的想法十分樸素,即先將子串t的第一位與主串s的第一位對齊開始匹配,當不能匹配時將子串整體往後移一位,然後重新匹配,以此類推直至排出結果 如當遇到下圖所示情況時,需將子串整體後移一位,將i,j分別回溯到主串第2位和子串第一位。kmp演算法 對bf進行思考後,我...
KMP演算法例題 總結
kmp之前沒學,然後排位賽又有一道題考了這個知識點,這題ac了一列人,就差我乙個.kmp演算法 建立乙個next函式,從而使字串匹配的時間複雜度由o n n 變成o n m 舉個例子 ababcab 和 abbbcabdc 首先建立next陣列,next 0 1 ababcab 10012012就是...