POJ 3461 字符串匹配(KMP / 哈希(有推导))
生活随笔
收集整理的這篇文章主要介紹了
POJ 3461 字符串匹配(KMP / 哈希(有推导))
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 1. 題目
- 1.1 題目鏈接
- 1.2 題目大意
- 2. Accepted代碼
- 2.1 KMP解法
- 2.2 哈希法(有推導(dǎo)過(guò)程)
1. 題目
1.1 題目鏈接
http://poj.org/problem?id=3461
類(lèi)似題目:LeetCode 30. 串聯(lián)所有單詞的子串(字符串哈希)
1.2 題目大意
模式串在主串中出現(xiàn)過(guò)幾次。
2. Accepted代碼
2.1 KMP解法
#include <stdio.h> #include <iostream> #include <cstring> int next[10001]; char a[1000001], b[10001]; void calNexts(char *b, int m, int *next) {next[0] = -1;int j = 0, k = -1;while(j < m){if(k == -1 || b[j] == b[k]){j++;k++;next[j] = k;}elsek = next[k];} } int str_kmp(char *a, int n, char *b, int m) {calNexts(b, m, next);int i = 0, j = 0, times = 0;while(i < n && j < m){if(j == -1 || a[i] == b[j]){i++;j++;}else{j = next[j];}if(j == m){times++;j = next[j];}}return times; } int main() {int count;std::cin >> count;while(count--){scanf("%s",&b);scanf("%s",&a);printf("%d\n",str_kmp(&a[0], strlen(a), &b[0], strlen(b)));}return 0; }2.2 哈希法(有推導(dǎo)過(guò)程)
參考別人的哈希函數(shù),哈希值的求法很犀利
自己推導(dǎo)的過(guò)程如下:
總結(jié)
以上是生活随笔為你收集整理的POJ 3461 字符串匹配(KMP / 哈希(有推导))的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: LeetCode 45. 跳跃游戏 II
- 下一篇: LeetCode 944. 删列造序