关于KMP
对于KMP,可以去看Matrix67的blog或者一些教程(有视频找度娘,可以去看看),理解还是蛮简单的。对于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 }
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.