标签:code src 前缀 style clu fail color 后缀 bit
KMP:(1) 求 字符串前缀 与 后缀 匹配的字符数
(2) next[0] = 0, next[1] = 0; 把求出的长度后移一位
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 1e5 + 7; 4 char p[maxn], s[maxn]; 5 int n,m; 6 int Nextnum[maxn]; 7 void GetFail(char p[], int plen) 8 { 9 Nextnum[0] = 0, Nextnum[1] = 0; 10 for(int i = 1; i < plen; i++) //模式串求 next[] 11 { 12 int j = Nextnum[i]; //返回上一次匹配结束时 j 指针的位置 13 while(j && p[i] != p[j]) j = Nextnum[j]; //匹配失效,模式串右移 j - next[j]位 14 Nextnum[i+1] = (p[i] == p[j]) ? j+1 : 0; //前后缀匹配成功 next[i+1] = ++j; 否则 next[i+1] = 0; 15 } 16 } 17 void Kmp(char s[],char p[]) 18 { 19 int last = -1; //记录位置用 20 int slen = strlen(s), plen = strlen(p); 21 GetFail(p,plen); //求next[] 22 for(int j = 0, i = 0; i < slen; i++) 23 { 24 while(j && s[i] != p[j]) j = Nextnum[j]; //匹配失效,模式串右移 j - next[j] 位 25 if(s[i] == p[j]) j++; //匹配成功,继续匹配 26 if(j == plen) //完全匹配 27 { //匹配后的题目逻辑 28 printf("%d ", i+1-plen); //输出在主串的起始位置 29 } 30 } 31 } 32 int main() 33 { 34 cin>>n>>p>>m>>s; 35 Kmp(s,p); 36 return 0; 37 }
标签:code src 前缀 style clu fail color 后缀 bit
原文地址:https://www.cnblogs.com/Edviv/p/11708519.html