关于KMP

对于KMP,可以去看Matrix67的blog或者一些教程(有视频找度娘,可以去看看),理解还是蛮简单的。对于next函数就是下面的情况:

kmp next函数

详细解释可以参照:http://blog.csdn.net/xiaoxian8023/article/details/8134292

咱作为蒟蒻,没什么好说的……

Code: Pascal是纯KMP定位,C++是KMP找出现次数,不过还有优化的余地,不过怎么改呢?……

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 #define re(i,s,t) for(int i=s;i<=t;i++)
 6 
 7 int n,i,j,ls,lt;
 8 char s[1000000+5],t[1000000+5];
 9 int next[1000000+5];
10 
11 void pnext()
12 {
13     int i=1,j=0;next[1]=0;
14     int lt=strlen(t);
15     while(i<=lt)
16     {
17         if(j==0||(t[i-1]==t[j-1])) 
18         {
19             i++;j++;next[i]=j;
20         }
21         else j=next[j];
22     }
23 }
24 
25 int index()
26 {
27     int sum=0,i,j,ls=strlen(s),lt=strlen(t);
28     i=1;j=1;sum=0;
29     while(i<=ls)
30     {
31         if(j>lt){j=lt-next[lt]+2;sum++;}
32         if(s[i-1]==t[j-1]||j==0)
33         {
34             i++;j++;
35         }
36         else j=next[j];
37     }
38     return sum;
39 }
40 
41 int main()
42 {
43     scanf("%d",&n);
44     gets(t);
45     while(n--)
46     {
47         gets(t);
48         gets(s);
49         s[strlen(s)]='*';
50         pnext();
51         cout <<index()<<endl;
52     }
53     return 0;
54 }
C++
program kmp;
var
 s,t:string;
 next:array [0..255] of integer;
procedure pnext(s:string);
var
 i,j:integer;
begin
 i:=1;j:=0;next[1]:=0;
 while (i<=length(s)) do begin
  if (j=0) or (s[i]=s[j]) then begin
   inc(i);inc(j);next[i]:=j;
  end
  else j:=next[j];
 end;
end;
function index(s,t:string):integer;
var
 i,j:integer;
begin
 i:=1;j:=1;
 while (i<=length(s)) and (j<=length(t)) do begin
  if (s[i]=t[j]) or (j=0) then begin
   inc(i);inc(j)
  end
  else j:=next[j];
 end;
 if j>length(t) then index:=i-length(t) else index:=0;
end;
begin
 readln(s);
 readln(t);
 pnext(t);
 writeln(index(s,t));
end.
Pascal 
posted @ 2013-08-26 22:48  lcj2018  阅读(227)  评论(0编辑  收藏  举报