KMP演算法解題模板(更新)

2021-08-25 08:18:06 字數 1924 閱讀 8325

/*

kmp演算法的主要作用在於對next陣列的運用,所以這裡只給出next陣列的模板

性質1:對於每乙個長度len的子串,該子串的最小迴圈節為len-next[len]

性質2:kmp的next不斷向前遞迴的過程可以保證對於每乙個當前字首,都有一段字尾與之對應

*/#include #include #include using namespace std;

const int maxn = 1e6+5;

int next[maxn];

char mo[maxn];

int n2;

void getnext() else j = next[j];

}return;

}int main()

/*

kmp模板

題意就是求b串在a串中的第一次匹配的下標,(從1開始)

str就是a,mo就是b

*/#includeusing namespace std ;

const int maxn = 1e6+5;

int next[maxn], n1, n2;

char str[maxn], mo[maxn];

void getnext() else j = next[j];

}return;

}int kmp() else j = next[j]; //next陣列尋找與當前字尾匹配最長的字首,省略不必要的查詢

if(j == n2) return i - n2 + 1; //首位址

}return -1;

}int main()

/*

kmp模板

題意就是求b串在a串中的出現次數(可重疊

str就是s,mo就是b

*/#includeusing namespace std;

const int maxn = 1e6+5;

int next[maxn], n1, n2;

char str[maxn], mo[maxn];

void getnext() else j = next[j];

}return;

}int kmp() else j = next[j];

if(j == n2)

}return cnt;

}int main()

/*

kmp模板

題意就是求b串在a串中的出現次數(不可重疊

str就是a,mo就是b

*/#includeusing namespace std;

const int maxn = 1e6+5;

int next[maxn], n1, n2;

char str[maxn], mo[maxn];

void getnext() else j = next[j];

}return;

}int kmp() else j = next[j];

if (j == n2)

}return cnt;

}int main()

/*

最小迴圈節 poj 2406 power strings

結論:如果len%(len-nxt[len])=0,那麼迴圈次數為len/(len-nxt[len]),否則為1

*/#include #include using namespace std;

char s[1000100];

int nxt[1000100];

void get_nxt()

else j = nxt[j];

}}int main()

return 0;

}

KMP演算法解題思路

bf暴力演算法進行模式匹配由於需要回溯,導致演算法效率低,kmp演算法對其進行改進的一點就是在某趟匹配失敗後,主串不進行回溯,而子串回溯到某乙個位置k。子串的每乙個位置都對應著乙個k,要找出這些值,首先列出子串所有的字首,分別對每個字首找出其最長公共前字尾 需注意,最長公共前字尾必須小於原字首且要相...

KMP演算法(模板)

time limit 1000ms memory limit 65536k 有疑問?點這裡 給定兩個字串string1和string2,判斷string2是否為string1的子串。輸入包含多組資料,每組測試資料報含兩行,第一行代表string1 長度小於1000000 第二行代表string2 長...

KMP演算法模板

在文字t 1.n 中找到某個模式p 1.m 所有出現的位置被稱作字串匹配問題 m n p3375 模板 kmp字串匹配 這道題在洛谷上的評級居然是普及 普及?qvq 實現起來還是比較簡單的,只不過有很多細節可以有很多種寫法,看別人的 容易凌亂。理解起來比較困難的部分是如何get next 不建議初學...