标签:pre name class char s 简单 fine while strlen lse
很简单的字符串匹配,KMP以及它的一个简单优化。整理成板子。
1 #include<bits/stdc++.h> 2 #define f(i,a,b) for(int i=a;i<=b;i++) 3 using namespace std; 4 char s1[100005]; 5 char s2[100005]; 6 int nxt[100005]; 7 //void getnxt(char s[],int nxt[]){ 8 // int len=strlen(s); 9 // nxt[0]=-1; 10 // int i=0,j=-1; 11 // while(i<len-1){ 12 // if(j==-1||s[i]==s[j]){ 13 // i++,j++; 14 // nxt[i]=j; 15 // } 16 // else j=nxt[j]; 17 // } 18 //} 19 void getnxt(char s[],int nxt[]){ 20 int len=strlen(s); 21 nxt[0]=-1; 22 int i=0,j=-1; 23 while(i<len-1){ 24 if(j==-1||s[i]==s[j]){ 25 i++,j++; 26 if(s[i]==s[j]) nxt[i]=nxt[j]; 27 else nxt[i]=j; 28 } 29 else j=nxt[j]; 30 } 31 } 32 int main(){ 33 while(~scanf("%s",s1)){ 34 if(s1[0]==‘#‘) return 0; 35 scanf("%s",s2); 36 getnxt(s2,nxt); 37 int len1=strlen(s1); 38 int len2=strlen(s2); 39 int k=0; 40 int cnt=0; 41 int i=0; 42 while(i<=len1){ 43 while(k<len2&&i<=len1){ 44 if(k==-1||s1[i]==s2[k]){ 45 i++,k++; 46 } 47 else{ 48 k=nxt[k]; 49 } 50 } 51 if(k==len2){ 52 cnt++; 53 k=0; 54 } 55 } 56 printf("%d\n",cnt); 57 } 58 }
标签:pre name class char s 简单 fine while strlen lse
原文地址:https://www.cnblogs.com/St-Lovaer/p/12244223.html