码迷,mamicode.com
首页 > 其他好文 > 详细

KMP

时间:2019-10-20 19:38:26      阅读:79      评论:0      收藏:0      [点我收藏+]

标签: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 }

 

KMP

标签:code   src   前缀   style   clu   fail   color   后缀   bit   

原文地址:https://www.cnblogs.com/Edviv/p/11708519.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!