关于子串的查找
1 char a[maxn],b[maxn]; 2 int lena,lenb,net[maxn]; 3 void getnet() { ///得到next数组 4 lenb=strlen(b); 5 net[0]=-1; 6 int i=0,j=-1; 7 while(i<lenb) { 8 if(j==-1||b[i]==b[j]) 9 net[++i]=++j; 10 else j=net[j]; 11 } 12 return ; 13 } 14 int getans() { ///KMP查找b串在a中的出现次数 15 lena=strlen(a); 16 lenb=strlen(b); 17 int ans=0; 18 if(lena==lenb&&lena==1) { 19 if(a[0]==b[0]) return 1; 20 else return 0; 21 } 22 for(int i=0,j=0;i<lena;i++) { 23 while(j>0&&a[i]!=b[j]) j=net[j]; 24 if(a[i]==b[j]) ++j; 25 if(j==lenb) ans++,j=net[j]; 26 } 27 return ans; 28 }